2013年3月23日土曜日

Stretch IK

最近バタバタしてて少し間があきましたが
今回はStretch IKです。

Stretch IKとは主にカートゥーン系のアニメーションに用いられる
セットアップの方法の一つです。

具体的には手足や胴体などが伸び縮みする方法です。


ただ少しややこしいので考え方をしっかり理解しながら
読んでいってもらえればと思います。



さて、単純に伸びると言ってもジョイントやバインドされたオブジェクトを
視覚的に伸ばす方法は2つあります。

1、ジョイントを移動させる
2、ジョイントにスケールをかける

まぁこの二つが考えられるのですが2の方が一般的なので
今回は2を説明します。


それから、今回はStretchではなくStretch IKです。
FKのStretchの考え方はジョイントを直接操作するのと同じなので
とても簡単なので今回は省きます。
(↑のようにスケールでコントロールするならばジョイントに直接スケールを
かけるのと同じ動作でFKはセットアップ出来ます。)




ではまず、考え方を・・・











今回のセットアップで重要な事はジョイントの方向を意識するということです。
このようにボーンがあったとき次の下位のジョイントの方向にX軸が向いている
ということが必要です。
(今回はX up Y - Z になっていますがそこは好きにやっても良いかもしれません)

何故方向が重要かというと、正しい方向にスケールをかける為です。
軸が違うと計算が複雑になったり伸びてほしい方向とは別の方向に伸びてしまう
ということになったりしますので、気を付けてください。


では、ここにIK handleをいれるとします。
そしてIK handleを動かすとジョイントが伸びきり、それ以上は動きません。















なので真ん中のジョイントにスケールをかけてみましょう。














するとこのように伸びてIK handleをさらに遠くへ動かせます。


つまり何が言いたいのかというとIK handleの位置に合わせて
スケールがかかればIK handleを制限なく伸ばすことが出来る訳です。
そして『伸びる』事ができます。


ではどうすればいいかという話ですが
腕で例えると
IK handleがもともとの腕の長さより2倍の位置に来たら腕を2倍に
IK handleがもともとの腕の長さより3倍の位置に来たら腕を3倍に
・・・
といった具合にすれば良い訳です。

計算式で言うと
(現在の腕の長さ÷もともとの腕の長さ)=ジョイントのスケール値
現在の腕の長さ=IK handleの位置
こんな感じです。

つまりIK handleの位置的に何倍伸びたかを求めてジョイントのスケールに入れれば良い訳です。



理解していただけたでしょうか。




ではそれらを踏まえ作り方を書きます。
今回は↑の計算はノードで繋いで作りますのでエクスプレッションは使いません。






















まず、ジョイントをX upで作ります。
この時にスケール補正にはチェックを入れておいてください。

そしてIK handleを入れます。

次に 作成→測定ツール→距離ツール
でIK handleの距離を計ります。











距離ツールは一度クリックしたあと、shiftを押しながらもう一度クリックで作成できます。
これでもともとの長さが計れました。

次に、rigとIK handleをペアレントコンストレインして
rigと距離ツールで使われているIK handle側のロケーターもペアレントコンストレインします。

これでrigを動かすとIK handleの距離が変わって計る事が出来ます。


次に、ハイパーシェードで乗算除算というノードを作ってください。
これは掛け算、割り算、累乗などの計算をしてくれるノードです。
これを使って現在のIK handleの位置がもともとの長さの何倍になっているか
を算出してあげます。




















アトリビュートエディタの操作を除算に変えます。
次にUI上に表示されている距離ツールの数値を選択し
ハイパーシェード上で入出力コネクションを押します。


















するとトランスフォームノードとシェイプノードがあるので
シェイプノードを選択しコネクションエディタの左側にロードします。
(シェイプノードはロケーター2つと繋がれている方です)

右側には先ほど作った乗算除算ノードをロードします。






















このようにdistanceとinput1Xをコネクションします。

次にrigを完全にジョイントが伸びきったギリギリの位置にもっていきます。
その時表示された距離を先ほどの乗算除算ノードinput2X(入力2のX)に打ち込みます。

これで(現在の腕の長さ÷もともとの腕の長さ)が求められました。






















後は乗算除算ノードをコネクションエディタの左側にリロードして
右側にジョイントをリロードし、outputXとscaleXをコネクションします。
(ちなみに一番上の画像で言う右側のボーンはコネクションしなくて良いです。)



これで、伸縮が出来ます!!


が、何処までも縮んでしまいIKが曲がらなくなってしましました。
なのでジョイントのアトリビュートエディタの制限情報でスケールに制限をかけてあげましょう。

これで完成です!!



+αとして制限を流動的にコントロールしたい方はクランプノードを
ググってみると良いと思います。

あと、IK splineでストレッチIKを作る方法もあります。
これは調べると何人か書かれていたので  ストレッチIK  とかでググってみてください。




今回も分かりにくくなってしまった気が・・・
まぁ質問などあったらコメントください。

とまぁ長くなりましたがこんな感じです。
しかしこの方法以外にもストレッチIKを作る方法は
いくつかあるので時間のある方は調べてみてはいかがでしょうか。

1 件のコメント:

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

    カートゥーン調のアニメーションするときにこのIKは重宝しますよね!

    返信削除