PythonとBlenderでテキスト回転アニメーションを作った
Blenderのアニメーションなどをpythonを利用して作れることを知ったのでとりあえずやってみた。
なにか作れればいいなと思ったのでまず3Dテキストを回転させるアニメーションを作った。
環境構築
OS X El Capitan 10.11.6
Blenderをダウンロードしてインストール。
自分はコマンドラインからレンダリングなどをしたかったのでエイリアスを作成した。
環境構築に関してはこちらのサイトを参考にした。
$ echo "alias blender=/Applications/blender.app/Contents/MacOS/blender" >> ~/.bash_profile $ source ~/.bash_profile
設定が完了したらblenderをコマンドラインで実行できる。
$ blender
便利だと思ったのがコマンド一列で動画ファイルを書き出しすることができるということ。
$ blender -b --python file.py -x 1 -o ./filename -F QUICKTIME -s 000 -e 250 -a
これを叩けばBlenderを立ち上げて書き出す必要がない。
実装
bpyモジュールを利用することによってpythonでblenderの操作をすることができる。
コードは以下の通り。
# -*- encoding:utf-8 -*- import bpy import math # 角度設定時に利用 ROT_QUATER = math.pi / 2 # テキストオブジェクトの追加 def add_text(text, t_color): bpy.ops.object.text_add() ob=bpy.context.object ob.data.body = text ob.data.extrude = 0.25 ob.rotation_euler[0] = ROT_QUATER ob.rotation_euler[2] = ROT_QUATER ob.data.align_x = 'CENTER' ob.data.align_y = 'CENTER' mat = bpy.data.materials.new("t_color") mat.diffuse_color = t_color ob.data.materials.append(mat) ob.active_material.diffuse_color = t_color return ob def animation(ob): START = 0 END = 250 bpy.context.scene.frame_set(START) obj = bpy.context.scene.objects.active obj.keyframe_insert(data_path='rotation_euler') bpy.context.scene.frame_set(END) ob.rotation_euler[2] += 15 obj.keyframe_insert(data_path='rotation_euler') if __name__ == '__main__': # 初期化 bpy.ops.object.delete() # 環境の設定 # カメラ camera = bpy.data.objects['Camera'] camera.location = (10, 0, 0) camera.rotation_euler = (ROT_QUATER, 0, ROT_QUATER) # オブジェクトの設定 # Color Setting bpy.context.scene.world.horizon_color = (0, 0, 0) text_color = (0, 0, 1) # テキストの追加 text_ob = add_text("Hello, Blender!", text_color) # アニメーション設定 animation(text_ob)
特に意識することではないがコーディングで作成するということなので、作成段階で分けるとこんな感じな気がする。
- 初期化
- 環境
- オブジェクト設置
- アニメーション
初期化
Blenderは起動時にすでにCubeというオブジェクトが設置してある。
pythonでレンダリングするときはこのオブジェクトを消すことを忘れずに。
bpy.ops.object.delete()
環境
アニメーションなどを表示する時のカメラや照明の角度、位置を設定できる。
今回はカメラを設定した。
camera = bpy.data.objects['Camera'] camera.location = (10, 0, 0) camera.rotation_euler = (ROT_QUATER, 0, ROT_QUATER)
オブジェクト設置
オブジェクトを詳細に設定し、それを配置する。
関数にして指定の文字列をオブジェクトとして生成する。
def add_text(text, t_color): bpy.ops.object.text_add() ob=bpy.context.object ob.data.body = text ob.data.extrude = 0.25 ob.rotation_euler[0] = ROT_QUATER ob.rotation_euler[2] = ROT_QUATER ob.data.align_x = 'CENTER' ob.data.align_y = 'CENTER' mat = bpy.data.materials.new("t_color") mat.diffuse_color = t_color ob.data.materials.append(mat) ob.active_material.diffuse_color = t_color return ob text_ob = add_text("Hello, Blender!", text_color)
アニメーション
オブジェクトが設置できたらアニメーションの設定をする。
といっても開始と終了のフレームを指定してフレームごとに変化の処理を記述するだけでだからそんなに難しくない。
def animation(ob): START = 0 END = 250 bpy.context.scene.frame_set(START) obj = bpy.context.scene.objects.active obj.keyframe_insert(data_path='rotation_euler') bpy.context.scene.frame_set(END) ob.rotation_euler[2] += 15 obj.keyframe_insert(data_path='rotation_euler') animation(text_ob)
出力結果
テキストやその色をpythonから編集してアニメーションを作れるようになった。
ここからさらにアニメーションの処理部分にコードを追加すると色々遊べる。
ob.rotation_euler[0] -= 15
出力結果はこちら
感想
pythonでBlenderの操作を記述することでGUIの処理を自動化できるのはいい点だと思う。
モジュールなどにして記述もさらに容易にできそうだ。
あとは物理演算や流体処理も可能らしいのでそれらを使ってみたい。
セルオートマトンのアニメーションとかも楽しそうだ。