セミブラフしていく

CS、機械学習関係の技術、論文めも

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モジュールを利用することによってpythonblenderの操作をすることができる。
コードは以下の通り。

# -*- 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)

出力結果

f:id:habakan6:20171112103502g:plain テキストやその色をpythonから編集してアニメーションを作れるようになった。
ここからさらにアニメーションの処理部分にコードを追加すると色々遊べる。

ob.rotation_euler[0] -= 15

出力結果はこちら
f:id:habakan6:20171112104123g:plain

感想

pythonBlenderの操作を記述することでGUIの処理を自動化できるのはいい点だと思う。
モジュールなどにして記述もさらに容易にできそうだ。
あとは物理演算や流体処理も可能らしいのでそれらを使ってみたい。
セルオートマトンのアニメーションとかも楽しそうだ。

参考リンク