2020年11月30日月曜日

constraintノードのweight

  各種コンストレインを適用したとき、コンストレイントノードには W0みたいなアトリビュートがあることに気が付きます。コンストレイントの影響度を設定するアトリビュートですが、なんだか挙動が思っていたようなものと違う印象を持ちます。



  W0の値を 0にしたとき、拘束されたノードは拘束前の位置へ戻ります。
  アトリビュートは少数も有効だったりしますが、0.0と1.0で補間するような動作をしてくれません。この部分がなんか思っている挙動と違う感じがしてしまいます。

  よく考えてみると当然と言えば当然なのですが、コンストレイントは拘束しているノードの座標を拘束しています。なので、W0で少数を指定したとしても、拘束しているノードの座標と、拘束前の元の座標との割合を計算できないようです。

  回避するためには、1つのノードを2つのノードで拘束します。

  片方はコントロール用で、もう片方は初期位置の座標用として拘束します。ただ、W0,W1の2つのアトリビュートを操作しなければならず、かつ、W0 が 1の時 W1は 0、W0が 0の時 W1は1のような風にしないと上手い位置へ補間してくれないため、もう一手間必要になります。

  このアトリビュートを操作するために、どこかのノードにカスタムアトリビュートを追加し、0と 1を入れ違いにするために、reverseノードを使います。

  こんな感じで接続すれば、こんな風になってくれます。

  ちょっと分かりづらいのでサンプルコードも

{
    string $lct1[]=`spaceLocator`;
    string $lct2[]=`spaceLocator`;
    string $lct3[]=`spaceLocator`;
    
    string $pCnst[]=`pointConstraint $lct2[0] $lct3[0] $lct1[0]`;
    
    addAttr -at "float" -ln "weight" -min 0 -max 1 -dv 0 -k true $lct3[0];
    
    string $rev =`createNode "reverse"`;
    connectAttr ($lct3[0]+".weight") ($pCnst[0]+".w0");
    connectAttr ($lct3[0]+".weight") ($rev+".ix");
    connectAttr ($rev+".ox") ($pCnst[0]+".w1");
    
    move 50 30 -30 $lct2[0];
    move -10 30 10 $lct3[0];
}

  コンストレイントのアトリビュートは、ノード名+W0とかになっていますが、ショート名ではw0で良いため接頭辞のノード名は省いてしまって大丈夫なのです。

  多数のノードで拘束している場合、どんな順番で拘束しているかを調べたり、ユーティリティノードの接続先を確認したりが複雑になってしまいますが、アニメーターは、動くノードの切り替えは、bool や enum でパキっと切り替わるよりも、weightを使って補間で切り替わるのを好むので、面倒でも対応しておくほうが喜ばれます。



0 件のコメント:

コメントを投稿