2013年3月19日火曜日

コンストレインとコネクションの違いについて

最近ちょっと忙しいのでさらっと基礎的なとこを・・・

今回は、コンストレインとコネクションの違いについて書きたいと思います。


これはあくまで私のイメージとしてのものなので
必ずしも正しい訳ではないと思います。



前回の記事等で、ノードのコネクションについて書いたりしてきましたが
コンストレインとは何が違うのでしょうか。

例えば、translate(移動)同士をコネクションするのと
ポイントコンストレインするのとでは
ぱっと見同じ様な気がします。

しかし、それぞれ一長一短で良さと悪さがあります。
その中でもセットアップで一番重要だと思う違いがあります。


コンストレイン
・全てWorldで制御される

コネクション
・全てコネクション元の値で制御される

このように制御の仕方が変わります。


実際、どのように違いが出るかというと





















このようにオブジェクト赤、青があり
上がポイントコンストレイン
下がtranslateコネクション
となっています。

この状態で2つの青を動かすと2つの赤も動きます。

では、次に青をそれぞれグループ化して上に一つ階層を作ります。
そしてそれぞれの青のグループを動かすと
上の赤は先ほどと同じく動きますが、下の赤は動きません。





















これが上で書いた違いです。

これはコンストレインは全てWorldで制御されるため
上の階層のグループが移動するとコンストレインされた赤も動きます。

反対にコネクションは、全てコネクション元の値で制御されるため
上の階層のグループには値が入っていますが
コネクションした青本体には値が入っていない為動きません。



これだけだと『なんだコンストレインのほうが優秀じゃないか』と思うかもしれません。
しかし、セットアップを行う上で絶対やってはいけないサイクルエラーを
引き起こしやすいという難点があります。


サイクルエラーとは皆さんも一度は目にしたことがあると思います。


// 警告: 'pSphere2.translateX' のサイクルは要求どおり評価しない可能性があります(この警告を無効にするには 'cycleCheck -e off' を使用します)。 //

こんな感じの警告のことです。

これはAがBを制御するようになっているにもかかわらず
BもAを制御するようになっていて
無限ループのようなサイクルが出てますよー
ってことを言ってます。


コンストレインはどの階層にいても影響を与えてしまいます。
コネクションはコネクション元の値のみで制御されます。

つまり、コンストレインの方が複雑に組みたい時や階層ごと制御したい時に
とっっっっても不便です。

そもそもコンストレインはコンストレインノードでオブジェクト同士を
繋いでいるのですが、たくさんつながっていて処理的には
単純にコネクションした方が断然軽いです。


そういう意味では単純なコネクションの方が優秀だと思います。




更に、コネクションでWorldの動きをさせることもできます。
まぁでもこの辺はMatrixとかが関わってきて解説がめんどくさくなるので
decomposematrix node とかをググってみたらいいと思います。

ただ、配列とか行列とかややこしいので根気のある人や頭の良い人はどうぞ。
ではでは。

1 件のコメント:

  1. お疲れ様です。
    フェイシャルアニメーションを日々勉強している学生です。

    コンストレインとコネクション、目から鱗の知識ですね!

    返信削除