2020年12月24日木曜日

回転の拘束を使う場合の注意点

  マントやスカートのリグを組んでいたりするとき、重力みたいなものを手軽に表現するために、回転の拘束にスキップフラグを付けて適用する。みたいな方法を使う場合があります。
  ただ、軽くテストしているときはには気にならないのですが、豪快にアニメーションをさせるようになってくると、フリップしてしまうような場面に出くわすことがあるのです。

  そんな時に確認するポイントをいくつか。


  テスト用に、こんな感じの極単純なリグを組んでみました。

  四角いコントローラに2本のボーンがぶら下がる感じで配置してあります。pelvis(骨盤)とskirt(スカート)としていますが、chest(胸)とmantle(clork:外套)みたいな感じでも良いです。

  ボーンの座標を決めているロケータを、コントロールリグであるカーブオブジェクトで  parentConstraint を使って拘束しますが、設定は下のように「オフセット」と「Y, Z回転」を拘束させるフラグにチェックをしておきます。

  左側のボーンと右側のボーンで2カ所を拘束します。

  この拘束設定では、コントローラのピッチ回転ではボーンはそのまま、ロール回転とヨー回転には追従しています。が、ヨー回転が90度を超えた辺りでフリップを起こします。

  じつは、pelvis_ctrl には、rotateOrder に xzy を設定してあります。普通に作成した場合の初期値は xyz なので、普通に組んでいた場合ではフリップの仕方が異なっているかもしれません。

  回転ツールを object や worldで使用している場合には、ほとんど気にならないのですが、アニメカーブは gimbalで補間されるため、どの軸を優先させるかはかなり重要な要素です。特に特定の軸だけを拘束しようとする場合では回転の仕方が違ってきます。
  重力のようにワールドのY軸で固定しようとした場合、xzy や zxy みたいに yが最後に来る rotateOrderだと良い感じになります。


  で、アニメーションの途中でフリップが起こるときは、拘束元と拘束先の rotateOrder が違っているのが原因という場合が多いようです。

  実際、このリグでは、拘束先のロケータの rotateOrder は xyzのままなので、pelvis_ctrlと同じ xzyへ修正修正します。


  左右のロケータの rotateOrderを修正して同じように回転させると、フリップは解消した感じ。


  xyz全てを拘束すると、見た目は同じになっているけれど数値は違う。となる場合があるので、拘束先と拘束元の rotateOrderは合わせておくのに越したことはないです。

  階層が深くなったりすると、これがまたなかなか厄介に・・・。

  完璧にフリップをなくすことが出来ない場合には、拘束のオン・オフを出来るような仕組みを作っておくのが良いかもしれません。

  その時は、こちらも参考に。-> constraintノードのweight



0 件のコメント:

コメントを投稿