>   >  スクリプト兵法書 〜MAX Script編〜:Vol.6:アニメーションの分離と差し替え
Vol.6:アニメーションの分離と差し替え

Vol.6:アニメーションの分離と差し替え

前回「Vol.5:MAXScriptから見たアニメーションデータ」では、 Autodesk 3ds Max(以下、3ds Max) 内部でのアニメーションデータの扱われ方と、MAXScript からどのようにアニメーションデータにアクセスするのかを学習しました。今回はさらに一歩進んでパイプライン構築に必要な機能を紹介します。

Vol.6:アニメーションの分離と差し替え

今回は、MAXScriptを用いてアニメーションデータの分離と差し替え方法を解説していきます

アニメーションデータの分離

前回(Vol.5:MAXScriptから見たアニメーションデータ)説明した通り、3ds Max 内ではアニメーションデータはコントローラとして扱われ、モデルデータとは別の扱いになります。これを上手に利用すると、アニメーションデータとモデルを分けて管理することが可能です。

では、簡単なデータを見て、確かめてみることにしましょう。

まずは前回同様、円運動をする Box を作成します。



 b = Box length:1 width:1 height:1
 for i=0 to 100 do (
 	addNewKey b.pos.controller.x_position.controller i
 	b.pos.controller.x_position.controller.keys[i+1].value =cos(360.0/100*i)
 	addNewKey b.pos.controller.z_position.controller i
 	b.pos.controller.z_position.controller.keys[i+1].value = sin(360.0/100*i)
 )

さらに球も作成します。



 Sphere radius:0.5

Box と Sphere のオブジェクトを作成

Box と球を作成した

タイムスライダを動かしてみてください。Box は円運動をし、球は原点に留まっています。ここで、Sphere001 のコントローラとして Box001 のコントローラを指定します。



 $Sphere001.controller = $Box001.controller

むむっ! 何も起きませんね。

しかし、トラックビューでアニメーションデータを確認してみてください。Sphere001 にもアニメーションデータが入っています。実は、スクリプトからコントローラを代入しただけではビューポートには反映されないのです。

そのため、このような場合は notifyDepends を使用します。



 notifyDependents  $Sphere001.controller

これは、指定したオブジェクトに関連するものに、更新情報を送信するコマンドです。

このようにして別のオブジェクトに代入したコントローラは、インスタンスと同じような振舞いをします。試しに Sphere のアニメーションデータを編集してみてください。 Box も連動してアニメーションが変化します。

では、 Box と Sphere のコントローラを別々に扱いたい場合はどうしたら良いのでしょう?

これは単純に copy を使うだけです。



 $Sphere001.controller = copy $Box001.controller

copy を使用すると、コントーラを複製して Sphere のコントローラとして割り当ててくれます。

この違いが少し判り辛いのでまとめてみます。最初の状態は下図のようになっています。Box と Sphere 別々にコントローラが付いていて、別々のアニメーションをしているとしましょう。
四角と球のオブジェクトを作成
代入を行うと下図のようになります。B は参照されなくなり、Box も Sphere も同じコントローラ/アニメーションを参照するようになります。この時、アニメーション A を変更するとそれに併せて Box も Sphere も動きが変わります。
四角と球のオブジェクトを作成
copy して代入する場合はこのようになります。
四角と球のオブジェクトを作成
アニメーションもコントローラもコピーされているので、A を変更しても Sphere にしか影響を及ぼしません。この挙動は、オブジェクトのコピーとインスタンスの違いと同じです。

結局、コントローラもオブジェクトと同様な扱いをすることができることが判りますね。

その他の連載