ドミノエディタを線路エディタに改造する


アニメ『RAIL WARS!!』
見よう見ようと思っていてなかなか見てなかったこのアニメをようやく見始めました。
この鉄道会社の社員は拳銃を持てるんですねえ。

アニメの影響で、線路が作りたくなりました。
ドミノ倒しは少し休憩して、線路を作ります。

前回まで作っていたドミノエディタの画像を変えるだけで、線路エディタになります。

Blenderの最初のCubeを線路に変えます。

import math

m=bpy.data.materials.new('Material.001')
m.diffuse_color=(0.9, 0.8, 1)
m.emit=0.2

bpy.context.object.data.materials.append(m)
cube=bpy.data.objects['Cube']
bpy.ops.transform.resize(value=(0.2,1,0.05))
bpy.ops.rigidbody.object_add(type='ACTIVE')
bpy.data.materials['Material'].diffuse_color=(0.22,0.16,0.05)
bpy.ops.object.duplicate()
bpy.ops.transform.resize(value=(0.2,1,2))
bpy.ops.transform.rotate(value= -math.pi/2,axis=(0,0,1))
bpy.ops.transform.translate(value=(0,0.7,0.2))
bpy.data.objects['Cube.001'].active_material=m;
bpy.ops.object.duplicate()
bpy.ops.transform.translate(value=(0,-1.4,0.0))

このようにCubeの形を変えて複製するだけで作れます。

このままではオブジェクトがばらばらですので、まとめます。

bpy.data.objects['Cube'].select = True
bpy.data.objects['Cube.001'].select = True
bpy.data.objects['Cube.002'].select = True
bpy.context.scene.objects.active=cube
bpy.ops.object.join();

オブジェクト名をCubeにしたかったので、active=cubeをしました。

後はドミノ配置と同じ要領で、並べます。


ん、向きが90度違ってました。join後に90度回転させます。

bpy.ops.transform.rotate(value= -math.pi/2,axis=(0,0,1))

さて、全体です。

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

m=bpy.data.materials.new('Material.001')
m.diffuse_color=(0.9, 0.8, 1)
m.emit=0.2

bpy.context.object.data.materials.append(m)
cube=bpy.data.objects['Cube']
bpy.ops.transform.resize(value=(0.2,1,0.05))
bpy.ops.rigidbody.object_add(type='ACTIVE')
bpy.data.materials['Material'].diffuse_color=(0.22,0.16,0.05)
bpy.ops.object.duplicate()
bpy.ops.transform.resize(value=(0.2,1,2))
bpy.ops.transform.rotate(value= -math.pi/2,axis=(0,0,1))
bpy.ops.transform.translate(value=(0,0.7,0.2))
bpy.data.objects['Cube.001'].active_material=m;
bpy.ops.object.duplicate()
bpy.ops.transform.translate(value=(0,-1.4,0.0))

bpy.data.objects['Cube'].select = True
bpy.data.objects['Cube.001'].select = True
bpy.data.objects['Cube.002'].select = True
bpy.context.scene.objects.active=cube
bpy.ops.object.join();
bpy.ops.transform.rotate(value= -math.pi/2,axis=(0,0,1))

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


線路っぽくはなりましたが、まだこの線路の上は電車は走れそうにありません。

Leave a Reply

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

CAPTCHA