倒れた時に違った色が見えるように、ドミノ牌の各面の色を変えてみます。
起動時のCubeの各面に色を付けていきます。
まずは色を揃えます。
>>> red=(1,0,0) >>> yellow=(1,1,0) >>> green=(0,1,0) >>> blue=(0,0,1) >>> white=(1,1,1) >>> orange=(0.8,0.3,0) >>> colorlist=[red,yellow,orange,blue,white,green]
「Blenderでルービックキューブ(その1)」で使った色と同じ色を使いました。立方体なので6面の6色です。
「Blenderマテリアル」でやったように、各面にさきほど作った色を割り当てます。
>>> import bmesh >>> bpy.ops.object.mode_set(mode='EDIT') {'FINISHED'} >>> bm=bmesh.from_edit_mesh(bpy.context.object.data) >>> i=1 >>> for f in bm.faces: ... m=bpy.data.materials.new("Material.%03d" % i) ... m.diffuse_color=colorlist.pop(0) ... bpy.context.object.data.materials.append(m) ... f.material_index = i ... i = i + 1 ...
向かって左側が正面で、bm.facesリストの第一要素(faces[0])の底面から、colorlistの第一要素のredが割り当てられ、順にfaces[1]~faces[5]まで割り当てます。
次は、Cubeの形をドミノ牌の形にします。
>>> bpy.ops.object.mode_set(mode='OBJECT') {'FINISHED'} >>> bpy.ops.transform.resize(value=(0.5, 0.17, 1)) {'FINISHED'} >>> bpy.ops.transform.translate(value=(0,0,1)) {'FINISHED'} >>> bpy.ops.rigidbody.object_add(type='ACTIVE') {'FINISHED'}
「Blenderドミノ(その2)」で使った計算式です。渦巻き状に牌が並びます。
>>> import math >>> r=60 >>> for i in range(60,300): ... inc_r=720/i ... rad_r=math.radians(r) ... x=math.log2(i)/math.sqrt(i)*2 * math.cos(rad_r) ... y=math.log2(i)/math.sqrt(i)*2 * math.sin(rad_r) ... bpy.ops.object.duplicate() ... bpy.ops.transform.translate(value=(x,y,0)) ... bpy.ops.transform.rotate(value=math.radians(inc_r),axis=(0,0,1)) ... r=r+inc_r
ドミノ倒しのアニメーションをさせるため、ここでキーフレームを設定しておきます。
>>> bpy.context.scene.frame_set(1) >>> bpy.context.active_object.keyframe_insert(data_path="rotation_euler",index=-1) True >>> bpy.context.active_object.keyframe_insert(data_path="location",index=-1) True
最初に倒すドミノ牌を、回転させます。
CubeのORIGINがCubeの中心に設定されているため、rotateさせても中心で回転するため、
倒れたように見えません。
一旦ORIGINをCubeの底に設定してから、roteteさせることにします。
>>> pos=bpy.context.object.location >>> bpy.context.scene.cursor_location=(pos.x, pos.y, pos.z-1) >>> bpy.ops.object.origin_set(type='ORIGIN_CURSOR') >>> bpy.ops.transform.rotate(value=1,axis=(0.5, 1, 0),constraint_axis=(True,True,True)) >>> bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS')
フレーム10ぐらいで、キーフレームを設定しておきます。
>>> bpy.context.scene.frame_set(10) >>> bpy.context.active_object.keyframe_insert(data_path="rotation_euler",index=-1) >>> bpy.context.active_object.keyframe_insert(data_path="location",index=-1)
最後に床を作ります。Planeを追加し拡大したら、PASSIVEの剛体に設定します。
bpy.context.scene.cursor_location=(0,0,0) bpy.ops.mesh.primitive_plane_add() bpy.ops.transform.resize(value=(77,77,1)) bpy.ops.rigidbody.object_add(type='PASSIVE')
全部通してスクリプトを見てみましょう。
import bpy,bmesh,math red=(1,0,0) yellow=(1,1,0) green=(0,1,0) blue=(0,0,1) white=(1,1,1) orange=(0.8,0.3,0) colorlist=[red,yellow,orange,blue,white,green] bpy.ops.object.mode_set(mode='EDIT') bm=bmesh.from_edit_mesh(bpy.context.object.data) i=1 for f in bm.faces: m=bpy.data.materials.new("Material.%03d" % i) m.diffuse_color=colorlist.pop(0) bpy.context.object.data.materials.append(m) f.material_index = i i = i + 1 bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.transform.resize(value=(0.5, 0.17, 1)) bpy.ops.transform.translate(value=(0,0,1)) bpy.ops.rigidbody.object_add(type='ACTIVE') r=60 for i in range(60,300): inc_r=720/i rad_r=math.radians(r) x=math.log2(i)/math.sqrt(i)*2 * math.cos(rad_r) y=math.log2(i)/math.sqrt(i)*2 * math.sin(rad_r) bpy.ops.object.duplicate() bpy.ops.transform.translate(value=(x,y,0)) bpy.ops.transform.rotate(value=math.radians(inc_r),axis=(0,0,1)) r=r+inc_r bpy.context.scene.frame_set(1) bpy.context.active_object.keyframe_insert(data_path="rotation_euler",index=-1) bpy.context.active_object.keyframe_insert(data_path="location",index=-1) pos=bpy.context.object.location bpy.context.scene.cursor_location=(pos.x, pos.y, pos.z-1) bpy.ops.object.origin_set(type='ORIGIN_CURSOR') bpy.ops.transform.rotate(value=1,axis=(0.5, 1, 0),constraint_axis=(True,True,True)) bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS') bpy.context.scene.frame_set(10) bpy.context.active_object.keyframe_insert(data_path="rotation_euler",index=-1) bpy.context.active_object.keyframe_insert(data_path="location",index=-1) bpy.context.scene.cursor_location=(0,0,0) bpy.ops.mesh.primitive_plane_add() bpy.ops.transform.resize(value=(77,77,1)) bpy.ops.rigidbody.object_add(type='PASSIVE')
コメント