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

今回は、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 と球を作成した
タイムスライダを動かしてみてください。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 にしか影響を及ぼしません。この挙動は、オブジェクトのコピーとインスタンスの違いと同じです。
結局、コントローラもオブジェクトと同様な扱いをすることができることが判りますね。