sysvbannerとBlenderドミノ(その1)


アニメ『GRANBLUE FACTASY -The Animation-』

出会いと別れの季節ですね。1話目は出会いから始まるのに、最終話での別れがあいまいだったりするアニメが多いので、別れの感動がほしい気がします。現実でも親しくて大切な人ほど、自然に離れてしまうものですよね(自分だけだろうか)。そうやって新しい出会いがやってきて、人は成長するんだと思います。グラブルのアニメ版ですが、定番な内容でしたが、面白かったです。ゲームをやったことはないので、一度やってみようかと思いました。

さて、まだBlenderでドミノ作ってます。今回はsysvbannerコマンドで作成したメッセージをドミノ倒しの倒れたら文字が浮かぶ仕掛けに埋め込んでみます。

まず最初にbannerコマンドでメッセージを用意しておきます。

$ banner see you again | perl -ne 'chomp;printf"%-40s\n",$_' > banner.txt

Blenderを起動して、python consoleから以下のスクリプトを実行し、メッセージが3Dになるか確認します。

def addobj( x, y ):
    bpy.ops.mesh.primitive_cube_add()
    bpy.ops.transform.translate(value=(x,y,0))

filename = "/home/takk/banner.txt"
f=open(filename)
lines=f.readlines()

for y, line in enumerate(lines):
    for x, ch in enumerate(line):
        if ch == '#':
            addobj(y,x)

import math
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


「SEE YOU AGAIN」がBlenderでも読めます。

配置した全Cubeをドミノの形にします。

for o in bpy.data.objects:
    if o.name.startswith('Cube'):
        bpy.ops.object.select_all(action='DESELECT')
        o.select = True
        bpy.ops.transform.resize(value=(0.5,0.2,1))


縦方向(X軸)が狭く、各ドミノ牌に隙間がありません。隙間を0.5個分入れてみます。

for o in bpy.data.objects:
    if o.name.startswith('Cube'):
        bpy.ops.object.select_all(action='DESELECT')
        o.select = True
        o.location.x = o.location.x * 1.5


いい感じになりました。

次は色を付けます。
新規にマテリアルを作成し、diffuse_colorを黄色にします。

m=bpy.data.materials.new('Material.001')
m.diffuse_color=(1,1,0)

全ドミノ牌にさきほど作成したマテリアルを割り付けます。

for o in bpy.data.objects:
    if o.name.startswith('Cube'):
        o.active_material=m


全部黄色になりました。

しかし、このままではsysvbanner文字(#)がない空白部分にドミノ牌が存在しないので、ドミノ倒しとなりません。
空白部分にも、ドミノ牌を配置します。

まずBlender起動時のCubeを空白用ドミノ牌として改造します。

import bmesh

bpy.ops.object.select_all(action='DESELECT')
cube=bpy.data.objects['Cube']
bpy.context.scene.objects.active=cube
cube.select=True
bpy.ops.object.mode_set(mode='EDIT')
m2=bpy.data.materials.new('Material.002')
m2.diffuse_color=(0,0,0)
bpy.context.object.data.materials.append(m2)
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')

倒れたら黒が見えるようにしました。

次は、空白部分に倒れたら黒になる牌をコピーします。

for y, line in enumerate(lines):
    for x, ch in enumerate(line):
        if ch == ' ':
            bpy.ops.object.select_all(action='DESELECT')
            bpy.context.scene.objects.active=cube
            bpy.data.objects['Cube'].select=True
            bpy.ops.object.duplicate()
            bpy.ops.transform.translate(value=(y*1.5,x,0))


仕掛けドミノが並びました。
うっすらSEEの文字が浮かんでますね。

まだいろいろと仕掛けを作らないとドミノ倒しになりませんので、
実験的に、全牌を回転させて、完成予想図を見てみましょう。

for o in bpy.data.objects:
    if o.name.startswith('Cube'):
        bpy.ops.object.select_all(action='DESELECT')
        o.select=True
        bpy.context.scene.cursor_location=o.location
        bpy.ops.transform.rotate(value=-math.pi/3,axis=(1,0,0))

これが予想図です。

Leave a Reply

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

CAPTCHA