OneonetのPyBE

Python,Blender,Excelのいろいろ

Blender × Blender ガンダムハンマーが破壊する世界その1

キューブを円柱状に積み上げ、物理の法則に従うガンダムハンマーが破壊する風景です。 ソースコードはこんな感じ。 衝突するメッシュはリジッドボディをメッシュにしないと、アニメーションをオンにすると同時にはじけ飛びます。円錐と球を使ってガンダムハンマーの先端を作成し、さらにクサリの1つと親子関係を設定しています。 クサリは一番最初のものだけリジッドボディをPassiveにすることで固定させることで、振り子のような動きにしてみました。 最初の衝突の時の挙動がすり抜けているような感じもしますが、どこをどうすると良くなるのかわからずこのままとしています。お分かりの方がいらしたらアドバイス頂戴したくよろしくお願いします。ソースコードは素のまま添付しておきます。実行させた後アニメーションをご確認頂けるかと思います。

#blender 2.93.1で動作確認
import bpy
import math

for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)

bpy.ops.mesh.primitive_cone_add(radius1=1, radius2=0, depth=4,enter_editmode=False, align='WORLD', location=(0, 55.5, 70), scale=(1, 1, 1))
bpy.ops.mesh.primitive_ico_sphere_add(enter_editmode=False, align='WORLD', location=(0, 55.5, 70), scale=(5, 5, 5))
bpy.context.object.instance_type = 'FACES'
bpy.data.objects['円錐'].select_set(True)
bpy.data.objects['ICO球'].select_set(True)
bpy.ops.object.parent_set(type='OBJECT', keep_transform=True)

for i in range(0,20):
    bpy.ops.mesh.primitive_torus_add(location=(0, i*2.6, 70), major_radius=1.0, minor_radius=0.2, rotation=(0, 0, 0))
    bpy.ops.rigidbody.object_add()
    bpy.context.object.rigid_body.collision_shape = 'MESH'
    if i==0:
        bpy.context.object.rigid_body.type = 'PASSIVE'

for i in range(0,20):
    bpy.ops.mesh.primitive_torus_add(location=(0, i*2.6+1.3, 70), major_radius=1.0, minor_radius=0.2, rotation=(0, 1.57, 0))
    bpy.ops.rigidbody.object_add()
    bpy.context.object.rigid_body.collision_shape = 'MESH'

bpy.data.objects['ICO球'].select_set(True)
bpy.ops.rigidbody.constraint_add()
bpy.data.objects['トーラス.039'].select_set(True)
bpy.ops.object.parent_set(type='OBJECT', keep_transform=True)

N = 36
RR1 = 10.0
for z in range(0, 20):
    for i in range(0, N):
        rad = 2 * math.pi * (i+z*.5) /N
        xx = RR1 * math.cos(rad)
        yy = RR1 * math.sin(rad)
        bpy.ops.mesh.primitive_cube_add(location=(xx, yy, z*1.01), size=1.0, rotation=(0, 0, rad))
        bpy.ops.rigidbody.object_add()

bpy.ops.mesh.primitive_plane_add(size=40, 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'

動画はミラーサイトでご覧ください。
oneonet-blog.blogspot.com