Vol.7:スクリプトからアニメーションを操作する場合の注意点
前回「Vol.6:アニメーションの分離と差し替え」は、Autodesk 3ds Max でアニメーションデータを扱うための方法を解説しました。今回は、スクリプトからアニメーションを操作するときに気をつけたい点を紹介していきます。

使用するシーンを準備する
まずは、今回の作例で使用するシーンを準備します。せっかくなので、これまで勉強したことを活かし、シーン自体もスクリプトで作成してみましょう。
p = undefined
for i=0 to 8 do (
b = Box length:10 width:10 height:10
b.Name = "src:Box00" + ((i+1) as String)
b.pos.z = i*15
b.parent = p
p = b
)
for i=0 to 8 do (
b = execute("$'src:Box00" + ((i+1) as String) + "'")
xCtrl = b.rotation.controller.x_rotation.controller
zCtrl = b.rotation.controller.z_rotation.controller
for j=0 to 100 do (
addNewKey xCtrl j
xCtrl.keys[j+1].value = 20*sin(360.0/100*(i*10+j))
addNewKey zCtrl j
zCtrl.keys[j+1].value = 10*sin(360.0/100*(i*10+j))
)
)
ここで execute() という関数が初めて出てきたので解説をしておきます。この関数は、引数として与えた文字列をスクリプトとして実行する関数です。これを使うことで、スクリプトの中で生成した文字列を使ってスクリプトを実行し、その結果を取得することができます。今回はループの中で使用して、 Box を取得するのに使用しています。
早速、このスクリプトを実行しましょう。すると、生き物のようにウネウネと動くオブジェクトが生成されます。
更に、動きの付いていないオブジェクトも作成してみます。
p = undefined
for i=0 to 8 do (
b = Box length:10 width:10 height:10
b.Name = "dest:Box00" + ((i+1) as String)
b.pos.z = i*15
b.parent = p
p = b
)
これで、準備が整いました。

スクリプトで生成したシーン
オブジェクトへのアニメーション転送
では、新しいオブジェクトにアニメーションを転送してみます。
for i=0 to 8 do (
s = execute("$'src:Box00" + ((i+1) as String) + "'")
d = execute("$'dest:Box00" + ((i+1) as String) + "'")
d.rotation.controller = copy s.rotation.controller
notifyDependents d.rotation.controller
)
いい感じですね :-)。ついでにボーンについても同様の操作をしてみましょう。
Bone の作り方はちょっと特殊です。作るためには BoneSys というインターフェイスを使用します。
BoneSys.createBone startPos endPos zAxis

BoneSys で Bone を生成
マニュアルを見ると、3つの引数を与える必要があります。これに合わせてスクリプトも書き替えましょう。
p = undefined
for i=0 to 8 do (
b = (BoneSys.createBone [0,0,i*15] [0,0,(i+1)*15] [0,1,0])
b.length = 15
b.Name = "bone:Bone00" + ((i+1) as String)
b.parent = p
p = b
)


