遥かへのスピードランナー

シリコンバレーでAndroidアプリの開発してます。コンピュータービジョン・3D・アルゴリズム界隈にもたまに出現します。

Blenderでドミノ崩し

前回に引き続き、今度はblenderでモデルを組み立ててみます。blender上ではpythonのマクロが使えるので、手作業が大変でも、自動化で簡単に複雑なモデルを組み立てることができます。
ってなわけでblender上でドミノを配列させるスクリプトを組んでみました。

from Blender import *
import math

scene = Scene.GetCurrent()

defRBFlags = Object.RBFlags.COLLISION | Object.RBFlags.PROP | \
    Object.RBFlags.BOUNDS | Object.RBFlags.RIGIDBODY | \
    Object.RBFlags.ACTOR | Object.RBFlags.DYNAMIC

for n in range(18):
    # n周目の作成
    r = 10 + 1.8 * n
    j = int(math.pi * r * 0.7)
    d = 2 * math.pi / j

    for i in range(j):
        # i個目の作成
        x = r * math.cos(d*i)
        y = r * math.sin(d*i)

        objname = 'dominoobj_' + str(n) + '_' + str(i)
        mdat = Mesh.Primitives.Cube(1.0)
        mdat.name = objname
        m = scene.objects.new(mdat,objname)

        m.SizeX = 0.5
        m.SizeY = 2
        m.SizeZ = 3
        m.LocX = x
        m.LocY = y
        m.LocZ = 1.5
        s = 360*d*i/(2*math.pi)
        m.RotZ = d*i

        # 物理エンジンの計算対象にするための設定
        m.rbFlags = defRBFlags
        m.rbMass = 0.5
        m.rbShapeBoundType = Object.RBShapes.BOX

Redraw()

やっていることはいたってシンプルで、半径の異なる同心円上にブロックオブジェクトを配置していっているだけです。また、rbXXXのプロパティを設定しているのは、物理エンジンの計算対象とするための設定です。

このスクリプトを実行した後は、床となるプレートオブジェクトと、ブロックを倒すためのボールオブジェクトをblender上で作ってあげます。そうすると以下のようなアニメーションが出来あがります。

うーん、面白い!