スクリプトからアニメーションをコントロールする 03
~スクリプトでアニメーションデータを生成~
やっとアニメーションデータを取得できたので、今度はスクリプトでアニメーションデータを生成してみます。ここまででマニュアルの色々な部分を見てきたので、何となく "あ、これかな?" という機能が思いつくかもしれません。
アニメーションデータを扱うための機能は、リファレンスマニュアルの "コントローラ キー関数" の項目にまとまっています。
アニメーションデータを設定する方法も幾つかありますが、今回はキーの作成と値の設定の二段階に分けてアニメーションデータを作成します。
まず、キーフレームを設定するためには addNewKey を使用します。選択したオブジェクトの X 位置に0フレームから 100 フレームまで1フレーム毎にキーを設定するには以下のように記述します。
s = selection[1]
for i=0 to 101 do (
addNewKey s.pos.controller.x_position.controller i
)
さらに、値も設定してみましょう。
s = selection[1]
for i=0 to 100 do (
addNewKey s.pos.controller.x_position.controller i
s.pos.controller.x_position.controller.keys[i+1].value = i
)
これまでの解説で、何をしているのか一目瞭然だと思います。このスクリプトを実行すると、1フレーム毎に 1Unit(デフォルトでは1インチ) X 方向に移動するアニメーションができるわけです。
しかし、これだけでは面白みがないので、もうちょっと工夫してみます。
s = selection[1]
for i=0 to 100 do (
addNewKey s.pos.controller.x_position.controller i
s.pos.controller.x_position.controller.keys[i+1].value =cos(360.0/100*i)
addNewKey s.pos.controller.z_position.controller i
s.pos.controller.z_position.controller.keys[i+1].value = sin(360.0/100*i)
)
X 軸と Y 軸に三角関数で計算した値を代入しています。これで、100 フレームで XZ 平面上で一回転するアニメーションができました。
さらに! 100×100 個のオブジェクトを作って、アニメーションを生成してみます...
for i=0 to 99 do (
for j=0 to 99 do (
b = Box pos:[i, j, 0] length:1 width:1 height:1
b.Name = "Box_" + (i as String) + "_" + (j as String)
for k=0 to 100 do (
addNewKey b.pos.controller.z_position.controller k
b.pos.controller.z_position.controller.keys[k+1].value = 10*sin(2*360.0/100*(i+j+k))
)
)
)
この処理はかなり重いです。100×100=1万個のオブジェクトを作って、それぞれに100 個づつキーフレームを割り当てているので無理もありませんね。ちょっと気長に待ってみてください。
単純なサインカーブを与えただけなのでシンプルな動きしかしませんが、それでも1万個のCube が動く様は壮観です。与える関数を工夫するともっと面白い動きを作ることができるので、色々と試してみてください。
今回の例で生成された Cube の波
今回は 3ds Max のアニメーションデータの扱いについて学習をしていきました。
普段はあまり意識をしないコントローラの構造や、スクリプトからどのようにアニメーションデータにアクセスをするのか、どのようにマニュアルから必要な情報を見つけるのかという感覚も掴むことができたかとできたかと思います。
次回からも引き続き 3ds Max 上のアニメーションデータの扱い方について、さらに掘り下げていきますよ。
TEXT_痴山紘史(JCGS)
映像制作のためのパイプライン構築をはじめ、技術提供を行なっていくエンジニア集団、「JCGS(日本CGサービス)」の代表取締役......というのは表の顔で、実態は飲み会とCG関連の技術が好きなただのCGオタク。
個人サイト 「PHILO式」