Blenderでサイコロを作る(Boolean)

12-7.Blender


アニメ『正解するカド』
序盤だけかもですが、ネゴシエートする相手である宇宙人があまりにもチョロい気がして、交渉も何もないじゃないかあと思ってしまいます。でも面白いです。アニメ好きじゃなくても楽しめそうな内容で、とにかく巨大なCubeが好きですねえ。実写化してほしいです。もし実写化されたら楽しみなシーンは、最初の旅客機が吸い込まれるシーンと、戦車の走行シーン。ああ、もっと戦車登場しないですかねえ。

今回はBlenderです。Add ModifierでBooleanを使ってみます。

cube=bpy.data.objects['Cube']

bpy.ops.mesh.primitive_uv_sphere_add()
sphere=bpy.data.objects['Sphere']
bpy.ops.transform.translate(value=(0,0,1))
bpy.ops.transform.resize(value=(0.3, 0.3, 0.3))

bpy.context.scene.objects.active=cube

bpy.ops.object.modifier_add(type='BOOLEAN')
bpy.context.object.modifiers['Boolean'].operation='DIFFERENCE'
bpy.context.object.modifiers['Boolean'].object = sphere

bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Boolean')

球体をずらすと、球体の形にへこんでいますね。

最後に球体を削除します。

bpy.context.scene.objects.active=sphere
bpy.ops.object.delete()

ではこの機能を利用してサイコロを作ってみましょう。
サイコロの目の数だけ球体を用意しますが、位置はあらかじめ決めてリスト化しておきます。

dice=[
[(0,0,1)],
[(1, 0.5, -0.5),(1, -0.5, 0.5)],
[(0.5, 1, 0.5),(-0.5, 1, -0.5),(0, 1, 0)],
[(0.5, -1, 0.5),(-0.5, -1, 0.5),(0.5, -1, -0.5),(-0.5, -1, -0.5)],
[(-1, 0.5, 0.5),(-1, -0.5, 0.5),(-1, 0.5, -0.5),(-1, -0.5, -0.5),(-1, 0, 0)],
[(0.5, 0.6,-1),(0.5, 0, -1),(0.5, -0.6, -1),(-0.5, 0.6,-1),(-0.5, 0, -1),(-0.5, -0.6, -1)]
]

リストを回して球体を配置します。

for locs in dice:
  for loc in locs:
    bpy.ops.mesh.primitive_uv_sphere_add()
    bpy.ops.transform.translate(value=loc)
    bpy.ops.transform.resize(value=(0.3, 0.3, 0.3))

Sphereから始まるすべてのオブジェクトを結合しておきます。

sphere_objs=[o for o in bpy.data.objects if o.name.startswith('Sphere')]
for o in sphere_objs:
  o.select=True

bpy.context.scene.objects.active=bpy.data.objects['Sphere']
bpy.ops.object.join()

立方体を球体の形にくりぬきます。

sphere=bpy.data.objects['Sphere']
bpy.context.scene.objects.active=cube

bpy.ops.object.modifier_add(type='BOOLEAN')
bpy.context.object.modifiers['Boolean'].operation='DIFFERENCE'
bpy.context.object.modifiers['Boolean'].object = sphere
bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Boolean')

移動させると、サイコロが目ができています。

全スクリプトです。

dice=[
[(0,0,1)],
[(1, 0.5, -0.5),(1, -0.5, 0.5)],
[(0.5, 1, 0.5),(-0.5, 1, -0.5),(0, 1, 0)],
[(0.5, -1, 0.5),(-0.5, -1, 0.5),(0.5, -1, -0.5),(-0.5, -1, -0.5)],
[(-1, 0.5, 0.5),(-1, -0.5, 0.5),(-1, 0.5, -0.5),(-1, -0.5, -0.5),(-1, 0, 0)],
[(0.5, 0.6,-1),(0.5, 0, -1),(0.5, -0.6, -1),(-0.5, 0.6,-1),(-0.5, 0, -1),(-0.5, -0.6, -1)]
]

cube=bpy.data.objects['Cube']

for locs in dice:
  for loc in locs:
    bpy.ops.mesh.primitive_uv_sphere_add()
    bpy.ops.transform.translate(value=loc)
    bpy.ops.transform.resize(value=(0.3, 0.3, 0.3))


sphere_objs=[o for o in bpy.data.objects if o.name.startswith('Sphere')]
for o in sphere_objs:
  o.select=True

bpy.context.scene.objects.active=bpy.data.objects['Sphere']
bpy.ops.object.join()
sphere=bpy.data.objects['Sphere']


bpy.context.scene.objects.active=cube

bpy.ops.object.modifier_add(type='BOOLEAN')
bpy.context.object.modifiers['Boolean'].operation='DIFFERENCE'
bpy.context.object.modifiers['Boolean'].object = sphere
bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Boolean')
bpy.context.scene.objects.active=sphere
bpy.ops.object.delete()

実行するとサイコロになります。

コメント

タイトルとURLをコピーしました