スクリプト コントローラ - 循環従属の回避
スクリプト コントローラの Target 変数 および Object 変数を使用すると、コントローラ値が更新されるときにオブジェクト subAnim ツリー全体を評価することができます。
スクリプト コントローラの最終結果が、その割当先と同一オブジェクトのその他のプロパティに異存する必要がある場合は、そのような「悪循環」の条件を回避するために、Target
変数または Object 変数を作成すると、MAXScript によってランタイム エラーが表示され、実行が中止されます。そうでない場合は、コントローラの更新によってその他のプロパティが更新され、今度はコントローラがまた更新されるというように、際限なく続くことになります。
機能しない:
|
obj = Teapot ()
-->$Teapot:Teapot001 @ [0.000000,0.000000,0.000000]
obj.scale.controller = scale_script()
-->Controller:Scale_Script
obj.scale.controller.addTarget "pos" obj.position.controller
-- Runtime error: Cannot add/set object, would create circular dependency: Controller:Position_XYZ
obj.scale.controller.setExpression "[0.01*pos.x,1,1]"
|
このような場合は、代わりにノード変数を使用します。
ノード変数にはシーン ノードに対する参照が含まれ、スクリプト コントローラの式は subAnim または MAXWrapper オブジェクトを直接指すのではなく、ノードからの必要なプロパティにアクセスします。
機能する:
|
obj = Teapot ()
-->$Teapot:Teapot001 @ [0.000000,0.000000,0.000000]
obj.scale.controller = scale_script()
-->Controller:Scale_Script
obj.scale.controller.addNode "obj" obj
-->true
obj.scale.controller.setExpression "[0.01*obj.pos.x,1,1]"
-->true
|
ティーポットを X 軸に平行に移動することによって、ワールド原点に対する距離にしたがってティーポットの X 軸が自動的にスケールされます。