C#でドミノエディタを作る(編集したドミノ配置をBlenderで読み込む)


アニメ『サクラダリセット』

リセットと言っているタイムリープの考え方が面白いです。世界のあらゆる物をセーブした状態に戻すことらしいです。使った本人は記憶がセーブ時に戻ってしまうので、よくわからない能力です。

続きのドミノエディタです。セーブしたデータを、Blenderで読み込んで、ドミノを配置します。ドミノエディタが使いやすくなってきたら、たくさんのドミノを使ってドミノ倒しをやろうと思っています。
ドミノの数がいくら増えても、本物のドミノと違って、失敗しても、リセットできるところがうれしいです。

左がドミノエディタで、右がBlenderで読み込んだ後の配置です。ずいぶん違いますがそのうち合わせていこうと思っています。

Blenderで読み込むには、以下のスクリプトを流すだけです。
(途中に出てくるtakkというユーザ名は変更します)

def addobj( x, y, ch ):
    if ch!="0":
        bpy.ops.object.select_all(action='DESELECT')
        bpy.context.scene.objects.active=cube
        cube.select=True
        bpy.ops.object.duplicate()
        bpy.ops.transform.translate(value=(x,-y,1))
        print(ch)
    if ch=="2":
        bpy.ops.transform.rotate(value=-math.pi/2,axis=(0,0,1))
    if ch=="3":
        bpy.ops.transform.rotate(value= math.pi/4,axis=(0,0,1))
        bpy.ops.transform.translate(value=(-0.6, -0.6, 0))
    if ch=="4":
        bpy.ops.transform.rotate(value= -math.pi/4,axis=(0,0,1))
        bpy.ops.transform.translate(value=( 0.6, -0.6, 0))
    if ch=="5":
        bpy.ops.transform.rotate(value=  math.pi/4,axis=(0,0,1))
        bpy.ops.transform.translate(value=( 0.6,  0.6, 0))
    if ch=="6":
        bpy.ops.transform.rotate(value= -math.pi/4,axis=(0,0,1))
        bpy.ops.transform.translate(value=(-0.6,  0.6, 0))
    if ch=='#':
        bpy.ops.object.mode_set(mode='EDIT')
        bm=bmesh.from_edit_mesh(bpy.context.object.data)
        bm.faces.ensure_lookup_table()
        bm.faces[3].material_index=1
        bpy.ops.object.mode_set(mode='OBJECT')

import bmesh,math

cube=bpy.data.objects['Cube']
bpy.ops.transform.resize(value=(0.5,0.17,1))
bpy.ops.rigidbody.object_add(type='ACTIVE')
bpy.data.materials['Material'].diffuse_color=(0,0,0)

m=bpy.data.materials.new('Material.Black')
m.diffuse_color=(1,1,0)
bpy.context.object.data.materials.append(m)

filename = "c:/Users/takk/Desktop/savedata.txt"
f=open(filename)
lines=f.readlines()

for line in lines:
    lis=line.split(',')
    if len(lis) >= 3:
        x=int(lis[0])
        y=int(lis[1])
        ch=lis[2]
        addobj(x,y,ch)

bpy.ops.mesh.primitive_plane_add()
bpy.ops.transform.resize(value=(99,99,1))
bpy.ops.rigidbody.object_add(type='PASSIVE')

bpy.ops.object.select_all(action='DESELECT')
cube.select=True
bpy.ops.object.delete()

camera=bpy.data.objects['Camera']
camera.location=(10,20,60)
camera.rotation_euler[0]=0
camera.rotation_euler[1]=0
camera.rotation_euler[2]=math.pi/2

bpy.data.scenes['Scene'].rigidbody_world.time_scale=3

左上を倒し始めるとこのように動きます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA