Blenderの物理シミュレーションをpythonスクリプトで作成

こんにちは、株式会社CFlatです。

この動画が面白かったので、似たような動画をpythonスクリプトで作ってみることにしました。
環境はmac+Blender2.66以上ですが、windowsでも下にあるpythonファイルを使えば簡単に実行できると思います。

ターミナルでBlenderを起動する

pythonスクリプトBlender起動中にも実行できますが、今回はターミナルから実行したいと思います。
ターミナルでBlenderを起動するには下記のようなaliasを.bash_profileに設定しておくと便利です。

alias blender='/Applications/blender/blender.app/contents/MacOS/blender'

.bash_profileを変更した後は"source .bash_profile"を一度入力して下さい。以降は"blender"と入力するだけでBlenderが起動します。
Blenderを起動した後にtest.pyを実行するには下記のようにターミナルで実行します。

blender --python test.py

Blenderをバックグラウンドで実行するには下記のように--backgourndを付け加えます。

blender --background --python test.py

pythonスクリプト

下記が実際に使用したpythonスクリプトです。
立方体と平面を作成して、それぞれ動的と静的な剛体に設定するだけで簡単に物理シミュレーションが実行できます。

# -*- coding: utf-8 -*-

import os
import bpy
import math

#デフォルトで存在しているCubeを削除
bpy.ops.object.delete()

#Cube作成
N = 10
for x in range(0, N):
  for y in range(0, N):
    for z in range(0, N):
      bpy.ops.mesh.primitive_cube_add(location=(x*2, y*2, z*2))
      bpy.ops.rigidbody.object_add()

#平面作成
bpy.ops.mesh.primitive_plane_add(location=(N-1, N-1, -10))
bpy.ops.rigidbody.object_add(type='PASSIVE')
bpy.data.objects["Plane"].scale = (N+10, N+10, 1)

#カメラ
bpy.data.objects["Camera"].location = (N+20, N+20, N+20)
bpy.data.objects["Camera"].rotation_euler = (math.pi/6, 0, math.pi*3/4)
bpy.data.cameras["Camera"].lens = 10

#照明
bpy.data.objects["Lamp"].location = (0, 0, N+10)
bpy.data.lamps["Lamp"].type = 'SUN'

# 物理シミュレーション
bpy.ops.ptcache.bake_all()

# 動画作成
bpy.context.scene.render.resolution_x = 400
bpy.context.scene.render.resolution_y = 300
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.render.image_settings.file_format = 'AVI_JPEG'
bpy.data.scenes["Scene"].render.filepath = "test.avi"
bpy.context.scene.frame_start = 0
bpy.context.scene.frame_end = 200
bpy.ops.render.render(animation=True)

# 保存
savePath = os.path.abspath(os.path.dirname(__file__))
bpy.path.relpath(savePath)
bpy.ops.wm.save_as_mainfile(filepath="test.blend", relative_remap=True)

動画完成

出力されたtest.aviをaviutlを使用して逆再生+再生すれば下記の動画が出来上がります。
逆再生動画って面白いですよね。他にも色々作ってみたいと思います。