各種コンストレインを適用したとき、コンストレイントノードには 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 件のコメント:
コメントを投稿