BlenderのプリミティブオブジェクトをPythonで操作する -- PythonによるBlender 3DCGモデリング(2) --

2015/02/24
  • このエントリーをはてなブックマークに追加
前回はBlenderのセットアップとテストスクリプトの実行を行いました。今回は、オブジェクトを新しく追加する方法についてご紹介したいと思います。

本連載で使用しているサンプルコードは、githubにて公開しています。
なお、本記事では下記のVersionを使用しています、
Mac: OS X Yosemite (Vesion 10.10.2)
Windows: Windows 8.1
Blender: 2.73a
Python: 3.4.2 (Blenderにバンドルされてるpythonです)

1. オブジェクトの追加方法

スクリプトを使ってオブジェクトを作成するには、主に以下の4つの方法があります。
  1. 1. プリミティブ方式
  2. 2. データ方式
  3. 3. オペレータ方式
  4. 4. 外部データのインポート
今回は、プリミティブ方式を取り上げます。

2. プリミティブ方式

[プリミティブ方式のメソッド]

この方式では、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のドキュメントには、どのパラメータがどういう作用を持つといったような細かい仕様は書かれていないことが多く、このような調査が必要になる場合があります
各プリミティブに使用可能なパラメータは、下記のドキュメントから参照することが出来ます。
http://www.blender.org/api/blender_python_api_2_73_8/bpy.ops.mesh.html

[使ってみよう!]

せっかくスクリプトでオブジェクトを作成しているので、ちょっと遊んでみましょう。例えば、複数のオブジェクトの作成は下記のようなコードになります。

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にするためには、ブーリアン演算の論理和をとる必要があります。次回は、この点について説明したいと思います。
Non-manifoldの説明は、下記のリンクがわかりやすいので、気になる方は読んてみてください。 http://blender.stackexchange.com/questions/7910/what-is-non-manifold-geometry

今回は、プリミティブ方式によるオブジェクトの追加方法を紹介しました。次回は、ブーリアン演算によるオブジェクトのワンシェル化から、実際に3Dプリンタによる出力までを行います。
『こういうことが知りたい!』とかありましたら、私のtwitterアカウントにreplyいただければと思います。

[PythonによるBlender3DCGモデリング]

takuro.wada

kabuku Inc. いろいろやる系のEngineer / 工作と妄想と唐揚がスキ。3Dプリンタとの出会いと共に、改めてものづくりの面白さに目覚め、カブクに参加。思わず使ってみたくなるような、欲しくなるようなプロダクトを作っていきたいです。

Posts

凸凹MAPに「紙」素材が仲間入り!改良部分などを徹底解説


【3Dフィギュア部】スキャンからフィギュアをつくってみた with ルーナちゃん


Blender Conference 2015に参加してきました!


「Autodesk Gallery Pop-Up Tokyo」にRinkakが出展中!


Maker Faire Tokyo 2015 ご来場ありがとうございました!


more...