機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【初心者向け】BlenderでPythonを実行する方法

Pythonを使ってBlenderの作業を効率化

こんな感じでPythonを使ってオブジェクトを作ったり操作することができます。上の画像はpythonを使って四角の領域内に赤と緑の球をランダムに生成した例です。

 

1. はじめに

Blenderにはプログラミング言語であるPythonが標準搭載されています。Pythonを使えばオブジェクト、メッシュ、マテリアルといったBlender内のほぼ全ての要素を操作・自動化することができ非常に便利です。そこで今回は初心者向けとしてまずBlenderPythonを実行する方法を紹介します。

 

2. BlenderPythonを実行する方法

今回はMac版のver3.2.0を使っていますがWindowsでも操作は同じなためご安心ください。

2.1 Scriptingのタブを開く

まずBlenderを開くと以下のような画面が現れますので、上のタブの赤枠「Scripting」を選択してください。

以下のような画面が現れます。コードを複数まとめて実行する場合は緑枠に、1行1行対話形式で実行していく場合は青枠(コンソール)にコードを記載していきます。どちらも重要ですが今回は緑枠にコードを書いていきます。

 

2.2 コードを書く、実行する方法

以下赤枠の「新規」を選択します。

今回プログラムの名前は「test」としました。これでコードが書けるようになります。また赤枠の右矢印をクリックするとプログラムを実行することができます。

 

3. 実施例)任意の空間に球をランダムに500個出現させるプログラム

Pythonの実行方法がわかったので、試しにプログラムを書いてみましょう。今回は例として決められた空間内にランダムで球を500個出現させるプログラムを作ります。

 

3.1 ライブラリのimport

まず必要なライブラリをimportします。今回はbpyとnumpyというライブラリをimportします。bpyはBlenderのオブジェクトやマテリアルを操作するのに必須なライブラリで、numpyは数値計算に便利なライブラリです。

import bpy
import numpy as np

 

3.2 ランダムな値を生成する関数

次にランダムな値を生成する関数を作ります。名前はfunc_random_locとしました。

def func_random_loc(min,max):
    s=(max - min) * np.random.rand(3) + min
    return s

np.random.rand(3)は0~1の範囲でランダムに数字(小数点あり)を3つ生成します。それに(max-min)をかけminの和を取ることで、好きな範囲でランダムな数字を生成することができます。例えば、def func_random(0.1,1)としたら以下のように0.1~1の範囲でランダムな数字が3つ生成されます。

>>> print(func_random(0.1,1))
[0.23767973 0.64538955 0.3735291 ]

この値を球のx,y,z座標として用います。

また球のサイズは正規分布に沿うように以下のようにnumpyのrandom.normalを使います。meanは中央値で、stv標準偏差です。

def func_random_siz(mean,stv):
    t=np.random.normal(mean, stv)
    return t

 

3.3 球を生成する

準備が整ったので球を作っていきます。今回は500個作るのでfor文を使います。

for s in range(0,num):
    random_location = func_random_loc(min,max)
    random_size = func_random_siz(mean,stv)
    bpy.ops.mesh.primitive_ico_sphere_add(radius=random_size/2, location = random_location, subdivisions=5)
    r=bpy.context.object

Blenderで球を生成する場合はbpyライブラリを使って以下のように書きます。

bpy.ops.mesh.primitive_ico_sphere_add(radius, location, subdivisions)

radiusは半径で球の大きさで、x,y,zの3つの値が必要です。例えば半径1の真球を作りたい場合は[1,1,1]とします。楕円を作りたい場合は例えば[1,0.5,0.5]などです。

locationは球の位置です、こちらもx,y,zに対応する3つの値が必要です。

最後のsubdivisionsは分割数で値を大きくするほどメッシュ数が増えて綺麗な球になります。概ね5あたりが良いと思います。

 

3.4 完成と実行

完成したプログラムはこちらです。今回は大きさが一辺5(-2.5~2.5)の立方体の領域に、中央値0.4、標準偏差0.2の粒径分布を500個の球を生成してみました。

import bpy
import numpy as np
def func_random_loc(min,max):
    s=(max - min) * np.random.rand(3) + min
    return s
def func_random_siz(mean,stv):
    t=np.random.normal(mean, stv)
    return t
min=-2.5
max=2.5
num=500
mean=0.4
stv=0.2
for s in range(0,num):
    random_location = func_random_loc(min,max)
    random_size = func_random_siz(mean,stv)
    bpy.ops.mesh.primitive_ico_sphere_add(radius=random_size/2, location = random_location, subdivisions=5)

 

4. おすすめ

以下の本はお勧めです。

 

5. 最後に

今回はBlenderPythonを使う方法を紹介しました。これを利用すれば自作アドオンを作ることも可能です、興味ある方はぜひ。