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