2013年3月28日木曜日

セットアップの参考サイト

最近いろいろと忙しくて書きたい記事はまだまだあるのですが
今回は参考サイトをいくつかご紹介します。



人体の構造やメッシュの割り方の参考になります。(英語)
http://hippydrome.com/

フェイシャルのセットアップされたフリーモデルがあります。(英語)
http://www.facewaretech.com/support/retargeter-support/faceware-facial-rig-library/

キャラクターTDをやってらっしゃる方のブログです。(英語)
http://circecharacterworks.wordpress.com/tag/rigging-2/

melを分かりやすく説明して下さってるブログです。私もここを見ながらmelを学びました。
http://flame-blaze.net/

melのコマンドリファレンスです。なんかこれ見やすい。
http://me.autodesk.jp/wam/maya/docs/Maya2009/Commands/show.html?floatFieldGrp.html&cat=Windows

melを勉強しながらツールなどを作っていた時とても参考になりました。
http://shikatanaku.blogspot.jp/



後半melですが、いずれこのブログでもmelを紹介できたらいいなと思っております。
でもmelってどこまで説明すればいいのか分からない・・・

思いだした順に並べたのでどのサイトが良いとかではないです。
というか全部とても良いサイトだと思います。

ただ勝手に紹介していいものなのかな・・・

まぁ参考サイトだしいいのか。
知恵袋とかも大丈夫ですしね!



今回は短いですが、次回はちゃんと書きます。(たぶん;;)

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を作る方法は
いくつかあるので時間のある方は調べてみてはいかがでしょうか。

2013年3月19日火曜日

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

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

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


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



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

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

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


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

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

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


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





















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

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

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





















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

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

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



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


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


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

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

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


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

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

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


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




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

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