OneonetのPyBE

Python,Blender,Excelのいろいろ

Blender x Python で作る途中で模様が出てくる玉転がし

2000個の玉をぶちまけてくるくる回っているところを見ていると何故か模様が浮かび上がる映像です。玉が転がる状況は好きに作ってもらえばいいですが、床板、ガードレール、大量の玉を配置するスクリプトを張っときます。前準備に特別なことはないので見れば何してるかわかるかと思います。

ポイントは準備ができたらアニメーションをスタートし、お好みのフレームでいったん止めます。そのあとオブジェクトモードになっていることを確認して"C"キーを押します。これによりボックス選択ではなくサークル選択選択モードになりますので、マウスホイールでサイズを調整してから、対象としたいメッシュをまとめて選択します。その後マテリアルプロパティでお好きな設定をした後、"マテリアルを選択物にコピー"を選ぶことで、選択したメッシュに全て同じマテリアルが適用されます。サークルである必要はなく、1つ1つクリックして選択するなりしてください。ポイントはアニメーションを途中で止めてその瞬間にちゃんと見えるように指定するところです。

カメラ、ライトはお好きに設定しましょう。見下ろす感じのアングルがよろしいかと思います。

f:id:oneonet:20220316161152p:plain
f:id:oneonet:20220316161202p:plain

#blender 3.0.0で動作確認
import bpy

#全部メッシュの削除
for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)

f = 200

#床板
bpy.ops.mesh.primitive_plane_add(size=20, enter_editmode=False, align='WORLD', location=(0, 0, -1), scale=(1, 1, 1))
bpy.ops.rigidbody.object_add()
bpy.context.object.rigid_body.type = 'PASSIVE'
bpy.context.object.rigid_body.friction = 0.0

#注ぎ口
bpy.ops.mesh.primitive_plane_add(size=3, enter_editmode=False, align='WORLD', location=(3, 7, 3), scale=(1, 1, 1))
bpy.ops.rigidbody.object_add()
bpy.context.object.rigid_body.type = 'PASSIVE'
bpy.context.object.rigid_body.friction = 0.0
bpy.context.object.rotation_euler[1] = -0.5
bpy.context.object.rotation_euler[0] = 0.5

#ガードレール 
for z in range (0,10):
    bpy.ops.mesh.primitive_torus_add(align='WORLD', location=(0, 0, -0.5+z*0.5), rotation=(0, 0, 0), major_radius=10, minor_radius=0.1)
    bpy.ops.rigidbody.object_add()
    bpy.context.object.rigid_body.type = 'PASSIVE'
    bpy.context.object.rigid_body.friction = 0.0
    bpy.context.object.rigid_body.collision_shape = 'MESH'

#注ぎ口の上に落ちる球を積み上げる 3×3を200段
for z in range (0,f*3,3):
    for x in range (0,3):
        for y in range (0,3):
            bpy.ops.mesh.primitive_uv_sphere_add(radius=0.5, enter_editmode=False, align='WORLD', location=(x+2, y+6, z+10), scale=(0.5, 0.5, 0.5))
            bpy.ops.rigidbody.object_add()
            bpy.context.object.rigid_body.collision_shape = 'SPHERE'
            bpy.context.object.rigid_body.friction = 0.0

是非動画をミラーサイトでご覧になってください。
oneonet-blog.blogspot.com