BlenderPython3日目。BlenderでPythonを用いてモデリングするために、頂点とインデックスの生成をおさえる。もちろん、ツール上に存在するプリミティブに関しては専用の関数があるため、それで問題ない場合はそちらで。
##作るもの
サイズ1.0の板ポリ。v1 から v4 の順で頂点を生成し、v1,v3,v2とv2,v3,v4で面を張る。
##オブジェクトのメッシュに直接アクセスする方法
これが楽。mesh.from_pydataで空の配列を渡している2つ目の引数は辺のインデックス。点、辺、面がBlenderにおいての基本要素。
import bpy
vertsData = [(-0.5, -0.5, 0), (0.5, -0.5, 0.0),(-0.5,0.5, 0.0),(0.5,0.5,0.0)]
facesData = [(0,2,1),(1,2,3)]
# Create Mesh
mesh = bpy.data.meshes.new("mesh")
mesh.from_pydata(vertsData, [], facesData)
mesh.update()
# Create Object
obj = bpy.data.objects.new("ItaPoly", mesh)
obj.data = mesh
# Add Object
scene = bpy.context.scene
scene.collection.objects.link(obj)
##Bmeshを利用する方法
頂点とインデックスをもたせるだけであれば、Bmeshでやる必要はなさそう。
import bpy
import bmesh
verts = [(-0.5, -0.5, 0), (0.5, -0.5, 0.0),(-0.5,0.5, 0.0),(0.5,0.5,0.0)]
# Create Empty Mesh & Object
mesh = bpy.data.meshes.new("mesh")
obj = bpy.data.objects.new("ItaPoly", mesh)
# Add Object
scene = bpy.context.scene
scene.collection.objects.link(obj)
# Create Bmesh
bm = bmesh.new()
bm_verts = []
for v in verts:
b_v = bm.verts.new(v)
bm_verts.append(b_v)
v1 = bm_verts[0]
v2 = bm_verts[1]
v3 = bm_verts[2]
v4 = bm_verts[3]
bm.faces.new([v1,v3,v2])
bm.faces.new([v2,v3,v4])
# QUAD
#bm.faces.new([v1,v2,v3,v4])
bm.to_mesh(mesh)
bm.free() # Release Bmesh
まとめ
Blenderでは、頂点とインデックスのデータを用意し、mesh.from_pydataに渡せばメッシュが生成できる。
##参考 (Blender2.8では動かない箇所あり)
Blender 2.80: Scene and Object API
create mesh then add vertices to it in python
different-ways-to-create-mesh-objects