2021年3月15日月曜日

ちょっと面倒なほうのaimConstraint

最初のうちはドキュメントが難解に感じるため、手っ取り早くオブジェクトを2つ選択して 初期状態の設定で aimConstraint を実行したり、たまに Aim Vector や Up Vector、World up vector のどれかをいじるくらいの感じだったりするのでしょうか。


ただ、aimConstraintを掛けているオブジェクト全体がひっくり返るようなアニメーションを作る場合、回ってほしくない軸がクルクルと回ってしまう場面が出てきます。
そんな時には、ちょっと面倒な「World up type」を使ったコンストレイントを使う必要がでてきます。


まずは素材として、シリンダーを4本用意します。

シリンダーの高さ方向をY軸に向けてしまうと Aim vectorと Up vectorも変更しないといけなくなるので、まずは高さが方向がX軸を向くよう横向きにシリンダーを作成します。

そしてオブジェクト名を上から、leftUpper, rightUpper, leftLower, rightLower とします。

aimConstraintを掛ける準備として、まず rightLower -> rightUpperの順で選択し、Aim Constraint Options を開きます。
World up typeはいくつか選べるようになっていますが、今回は「Object up」を指定。

すると、World up vectorがグレーアウトし、代わりに World up objectの部分が編集可能になります。
ここへ leftUpper と入力し、[Add]または[Apply]を実行。

まずは、1つ aimConstraintが掛かりました。

この World up object へオブジェクト名を入力するのが面倒なのですが、

  • leftLower -> leftUpper では rightUpper
  • rightUpper -> rightLower では leftLower
  • leftUppert -> leftLowerでは rightLower

と全部で4回 aimConstraintを実行します。

"chest"と命名したロケーターに、leftUpperと rightUpperを階層化して、それぞれ右側、左側へと配置すれば、このような見た目になります。

もう少し雰囲気を出すために、spineとchestをモデリング。

chestを動かすとこんな具合に動きます。

World up object に対面側のオブジェクトを指定しているので、全体がひっくり返ったとしても、シリンダーの向きは固定されます。

ただ、実際リギングに回ってくる段階では、このシリンダーは今回みたいなワールド軸に沿った軸になっていなかったり、そもそもオブジェクトが1つにマージされて軸自体が無かったりするので、aimConstraintを掛ける前に、いろいろ準備しないといけない訳なのですが・・・。

コンストレイント自体も、Aim Constraint Optionsで毎回ノード名を入力するのも大変なのでスクリプトで実行するようにしておくのも効率的です。

スクリプトエディタの履歴には、

aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 0 1 0 -worldUpType "object" -worldUpObject leftUpper;

のような履歴が残っているので、これを参考に、

global proc setAimConstraint(
     string $aimObject
    ,string $aimTarget
    ,string $upObject )
{
    aimConstraint -o 0 0 0 -w 1 -aim 1 0 0 -u 0 1 0 -wut "object" -wuo $upObject $aimTarget $aimObject;
    
}

みたいなスクリプトを作って複数回実行するほうが楽になります。



0 件のコメント:

コメントを投稿