アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

Blender pythonでメッシュから立方体を作る。

3Dビュー→追加→メッシュ→立方体で作られるメッシュと同じものを作りたい。

この立方体実はBlenderを起動したときに出てくる立方体とは面の向きが違うのでちょっと注意が必要なのである。

bpy.ops系の場合

一行で済む
bpy.ops.mesh.primitive_cube_add(enter_editmode=False, location=(0, 0, 0))

bpy.data系の場合

頂点の座標と面のidは図のようになっている
f:id:katsumi3:20200118160302p:plain

スクリプトで確認

obj=bpy.context.object
msh = bpy.data.meshes[obj.data.name]
for v in msh.vertices:
        print(v.co)

結果

<Vector (-1.0000, -1.0000, -1.0000)>
<Vector (-1.0000, -1.0000, 1.0000)>
<Vector (-1.0000, 1.0000, -1.0000)>
<Vector (-1.0000, 1.0000, 1.0000)>
<Vector (1.0000, -1.0000, -1.0000)>
<Vector (1.0000, -1.0000, 1.0000)>
<Vector (1.0000, 1.0000, -1.0000)>
<Vector (1.0000, 1.0000, 1.0000)>

それぞれの面が持ってる頂点のIdを確認

for v in msh.polygons:
     print(v.vertices[0:])

結果

(0, 1, 3, 2)
(2, 3, 7, 6)
(6, 7, 5, 4)
(4, 5, 1, 0)
(2, 6, 4, 0)
(7, 3, 1, 5)


以上をもとにmeshを作ってみる

import bpy
#頂点座標を上のと同じ順で行列に入れていく
vertices=[
        [ -1 , -1 , -1 ],
        [ -1 , -1 , 1 ],
        [ -1 , 1 , -1 ],
        [ -1 , 1 , 1 ],
        [ 1 , -1 , -1 ],
        [ 1 , -1 , 1 ],
        [ 1 , 1 , -1 ],
        [ 1 , 1 , 1 ]
        ]

#辺は特に設定の必要なし
edges = []

#面と頂点のidを紐づける
#面に向かって時計回りの逆に頂点を登録していく
faces = [
        [ 0 , 1 , 3 , 2 ],
        [ 2 , 3 , 7 , 6 ],
        [ 6 , 7 , 5 , 4 ],
        [ 4 , 5 , 1 , 0 ],
        [ 2 , 6 , 4 , 0 ],
        [ 7 , 3 , 1 , 5 ]
        ]

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

obj = bpy.data.objects.new( 'new_cube', mesh )
co = bpy.context.collection
obj.location = (0, 0, 0)
co.objects.link(obj)

長い・・・。
一行で済んだ方が楽。