ホーム < ゲームつくろー! < ゲームプログラマのためのBlender

ゲームプログラマのためのBlender スクリプト編
その4 頂点からポリゴン生成

[Blender Ver2.7.9]


 スクリプトから頂点を生成し、そこにポリゴンを張ってみます。



@ 頂点座標とインデックスからポリゴン生成

import bpy
import mathutils
from mathutils import Vector

# vertices
vertices = []
vertices.append( ( 0, 0, 0 ) )
vertices.append( ( 0, 10, 0 ) )
vertices.append( ( 10, 10, 0 ) )
vertices.append( ( 10, 0, 0 ) )

# edges
edges = []

# indices
faces = [ [0, 1, 2, 3] ]

# mesh
mesh = bpy.data.meshes.new( 'mesh' )
mesh.from_pydata( vertices, edges, faces )

# attach object
obj = bpy.data.objects.new( 'square', mesh )
obj.location = (0, 0, 0)
bpy.context.scene.objects.link( obj )

 色々ありますので噛み砕いて見ていきましょう。

 Blenderで新規にポリゴンを作る方法は色々とあるようですが、上の方法は「頂点とその番号からメッシュを作る」大変単純な方法です。まず頂点は配列データとして作成します。Pythonの配列は、

vertices = []

のように[ ]だけで作れます。配列に何かを追加するにはappend関数を用います。配列には何でも放り込めるのですが、頂点は3次元のタプル((1,2,3)のような)なのでコードのように頂点座標をタプルで与えています。Blenderは多角形ポリゴンをサポートしているので、DirectX等のように三角ポリゴンを意識する必要はあまりありません。

 次に辺の情報(edges)を作るのですが、これは空の配列で構いません。というのもそれは続くフェイスの情報から自動生成されるからです。よってコード内でも空にしています。

 続いてフェイス(面:faces)の情報を作成します。フェイスは3点以上の頂点の並びを配列に格納した物です:

faces = [ [0, 1, 2, 3] ]

頂点の並びは座標では無くて先のverticesにある配列の要素番号で指定します。いわゆる「頂点インデックス」です。Pythonの配列は0基底なので0番からカウントしましょう。上のフェイス、良く見ると配列が配列に入っている構造になっています。これは頂点の並びから複数のフェイスを作成可能だからです。例えば上の4頂点(正方形)から対角線で分けた2つのフェイスを作るには、

faces = [ [0, 1, 2], [0, 2, 3] ]

とフェイス配列の中にインデックス配列を2つ格納します。

 頂点、辺、フェイスの情報を揃えたら、その情報を反映させる新規のメッシュを作成します。コードの bpy.data.meshes.new関数に任意のメッシュ名を渡すと空のメッシュ(bpy.types.Mesh型)が作られます。Mesh型の持つfrom_pydata関数に頂点、辺、フェイス情報を渡すとそれを反映したメッシュが完成です。ただし、このメッシュだけでは3Dビュー内には何も表示されません。3Dビューに存在出来る物は「オブジェクト(Object)」だからです。そのため、メッシュを保持するオブジェクトも合わせて作る必要があります。

obj = bpy.data.objects.new( 'square', mesh )

bpy.data.objects.new関数が新規のオブジェクトを作る関数です。第1引数にオブジェクト名、第2引数にメッシュを渡すとそのメッシュを保持したオブジェクトが作られます。作った直後はオブジェクトは3Dビューのシーンに置かれている訳ではないので、最後にシーンのアウトライナーにリンク(接続)すると3Dビューに表示されます:

bpy.context.scene.objects.link( obj )

このスクリプトを実行すると、正方形のポリゴンが3Dビュー内に出現し、アウトライナーにそれがオブジェクトとして追加されます: