2013年1月15日火曜日

SoftImageと3DSMAXのエクスプレッション/スクリプトコントローラー対照表 その2

スクリプトコントローラーではスクリプトコントローラーオブジェクトにdependsOnでコントローラーを割り当てる他に、
特定のオブジェクトノードを指定して、そのtransformの更新をリアルタイムにスクリプトコントローラーオブジェクトに反映する方法があります。

MAXScriptヘルプの ノード変数

AddNode <&TSTR>Name Node

と書かいてある部分がそれですが、具体的には

$dummy_a.pos.controller.X_position.controller.AddNode "Node_0" $dummy_b

のように書くようです。
  • $dummy_a.pos.controller.X_position.controllerはオブジェクト内にあるスクリプトコントローラーの場所です。
  • .AddNode "Node_0"でスクリプトコントローラー内にNode_0という名前でノードが登録されます。
  • $dummy_bはこれが動くとスクリプトコントローラーがリアルタイム更新するオブジェクトです。

dependsOnと違って使用するスクリプトコントローラーが入っている正確な位置を特定して書かなければならないため
メンテナンスを考えると頭が痛いような気もしますが、Max8以降はdependsOnに変わって.AddNodeでの指定が推奨のようです。
dependsOnはMax9~Max2012でも一応挙動するので、特に循環従属問題等でエラーが出なければ、対応している間はこちらを使うのもありかもしれません。

前述のヘルプ内では

ノード変数はシーンノードの参照を含有します。参照は名前に従属しないため、変数に格納されたノードの名前を変更してもスクリプトコントローラの動作は影響されません。

とありますが、実際のところリグ等でパス名リテラルを使ってオブジェクト名を管理する方法をとると、うまく行かないので注意が必要です。
一応下にSoftImageと3dsMaxでの挙動説明など書いてみました。

挙動説明 SoftImage
(Expression)
3DSMAX
(ScriptController)
  • null_bのローカルX軸位置を動かすと
    null_aのローカルX軸位置が追従する
  • dummy_bの親X軸位置を動かすと
    dummy_aの親X軸位置が追従する
null_b.kine.local.posx pass_dummy_a = ""
objname_dummy_a = execute("$" + pass_dummy_a + "dummy_a")
pass_dummy_b = ""
objname_dummy_b = execute("$" + pass_dummy_b + "dummy_b")

objname_dummy_a.pos.controller.X_position.controller.AddNode "Node_0" dummy_b

objname_dummy_b.inode.posInParent.x