[プリミティブ方式のメソッド]
この方式では、APIのメソッドをコールすることでプリミティブを追加することができます。
前回のテストプログラムではこの方法で円錐を追加しており、基本的な形を使って作業を始める場合に有効です。
プリミティブとは、Blenderが定義する基本的形(Plane:平面, Cube:直方体, Circle:円, UV Sphere:UV球, Ico Sphere:Ico球, Cylinder:円柱, Cone:錐体, Torus:ドーナツ型)です。
具体的には、下記のコードで各オブジェクトを追加することが可能です。
# Add plane
bpy.ops.mesh.primitive_plane_add()
# Add cube
bpy.ops.mesh.primitive_cube_add()
# Add circle
bpy.ops.mesh.primitive_circle_add()
# Add UV sphere
bpy.ops.mesh.primitive_uv_sphere_add()
# Add Ico sphere
bpy.ops.mesh.primitive_ico_sphere_add()
# Add cylinder
bpy.ops.mesh.primitive_cylinder_add()
# Add cone
bpy.ops.mesh.primitive_cone_add()
# Add torus
bpy.ops.mesh.primitive_torus_add()
前回のテストプログラムの一部を書き換え、下記のプログラムを作成します。
import bpy
def delete_all():
for item in bpy.context.scene.objects:
bpy.context.scene.objects.unlink(item)
for item in bpy.data.objects:
bpy.data.objects.remove(item)
for item in bpy.data.meshes:
bpy.data.meshes.remove(item)
for item in bpy.data.materials:
bpy.data.materials.remove(item)
def add_primitives():
# Add plane
bpy.ops.mesh.primitive_plane_add()
# Add cube
bpy.ops.mesh.primitive_cube_add()
# Add circle
bpy.ops.mesh.primitive_circle_add()
# Add UV sphere
bpy.ops.mesh.primitive_uv_sphere_add()
# Add Ico sphere
bpy.ops.mesh.primitive_ico_sphere_add()
# Add cylinder
bpy.ops.mesh.primitive_cylinder_add()
# Add cone
bpy.ops.mesh.primitive_cone_add()
# Add torus
bpy.ops.mesh.primitive_torus_add()
if __name__ == "__main__":
delete_all()
add_primitives()
このスクリプトを実行してみましょう。上記をコピーして、tut2.pyという名前で保存します。保存したディレクトリにコマンドライン(Mac:ターミナル、Windows:コマンドプロンプト)で移動し、下記をタイプします。
$ blender -P tut2.py
実行すると、下記のように表示されます。

ちょと何かよくわからないですね。表示のシェーディングをWireframeに変更してみましょう。

ちょっと拡大すると下記のようになります。

重なっていてるため少し見づらいですが、各オブジェクトが生成されていることが分かります。
[メソッドに渡せるパラメータ]
これらのメソッドには、引数として作成時にオブジェクトの形や配置場所を変更するパラメータを設定することが可能です。例えば、Coneでは下記の引数を与えることができます。
パラメータ名 |
意味 |
vertices |
底面の頂点数 |
radius1 |
底面の半径 |
radius2 |
上面の半径(0だと錐体、>0だとすり鉢状になる) |
depth |
高さ |
end_fill_type |
上面と底面の面の貼り方 |
view_align |
Viewに正対させて配置するかどうか |
location |
作成する位置 |
rotation |
作成時の回転 |
layers |
作成するレイヤー |
たとえば、Coneに対して下記ように引数を与えると
bpy.ops.mesh.primitive_cone_add(
vertices=6,
radius1=6,
radius2=3,
location=(3, 0, 0),
rotation=(0.5, 0, 0)
)
このような形になります。

ちなみに、このようにメソッドで指定可能なパラメータは、BlenderのGUI上でオブジェクトを追加した時に、左下に表示されるパラメータと同一です。動作を確認する場合には、ここを操作することでパラメータがどのような影響を持つかどうかを調べることが出来ます。
Blenderのドキュメントには、どのパラメータがどういう作用を持つといったような細かい仕様は書かれていないことが多く、このような調査が必要になる場合があります
[使ってみよう!]
せっかくスクリプトでオブジェクトを作成しているので、ちょっと遊んでみましょう。例えば、複数のオブジェクトの作成は下記のようなコードになります。
def add_sankon():
for x in range(3):
bpy.ops.mesh.primitive_cone_add(
location=(x, x, 0)
)

簡単にサンコン(3つのコーン)が出来ました。もっと多くのオブジェクトを作ってみましょう。
def add_multiple_cone():
for x in range(10):
for y in range(10):
bpy.ops.mesh.primitive_cone_add(
location=(x, y, 0),
)
簡単に100コーンを作成することができました。
もう少し増やしてみましょう。先程のコードの2箇所のrange(10)をrange(32)に変更します。実行にすこし時間はかかりますが、これで1024コンです。

壮観ですね。
次は、100コンにランダム要素を加えてみましょう。
def add_multiple_cone_with_rotation():
import random
for x in range(10):
for y in range(10):
r1 = random.random()
r2 = random.random()
r3 = random.random()
bpy.ops.mesh.primitive_cone_add(
location=(x, y, 0),
rotation=(r1, r2, r3)
)
ちょっとへんな気分になってきましたね。

他にもいろいろ試してみてください!
ただし、この状態ではNon-manifoldなため、3Dプリンタでは出力することが出来ません。(もしくは出力したとしても、綺麗に出力されない場合が多いです)データをmanifoldにするためには、ブーリアン演算の論理和をとる必要があります。次回は、この点について説明したいと思います。