2013年11月16日土曜日

ただいま・・・

ただいま、卒業制作の日々に追われておりまして
なかなか更新できず、申し訳ないです。














また、時間の余裕を見つけ次第更新しますので
もうしばらくお待ちをー(ToT)/~~~

あ、別に待ってないか。笑

2013年9月18日水曜日

Egg man animation

お久しぶりです。
最近、2週間弱くらいで10秒のアニメーションを作りました。

まぁ今回はモーションキャプチャーの検証と質感の検証など
実験的にいろいろやってみました。



Eggman Animation from Takayuki Yanagisawa on Vimeo.

最近、いろいろたてこんでいてなかなかブログが更新出来てないです。
せめて最低、月一では更新したい・・・

一応、音はフリー素材を使わせて貰いました。
BGMはMusic is VFRさんより
SEは聞き取りにくいのでイヤホン等をおススメします。

次回はきちんと技術的なとこかけるといいな。
ではでは。

2013年8月24日土曜日

tyDisplaceDeformer

今回は、pythonでmaya APIを触ってpluginを作ってみたのでご紹介します。

まだ処理が重かったりで実装は難しいのでコードの公開は控えます。


tyDisplaceDeformer from Takayuki Yanagisawa on Vimeo.

pymelを使ったら遅くなった?んでしょうか?

またpythonなどもblogでやっていけたらと思います。

2013年7月8日月曜日

2013年7月7日日曜日

サウンドウェーブをmayaのtlanslateに持っていく

お久しぶりです。


今回は音声ファイルをmayaにもっていこうと思います。

単純に再生するだけならタイムラインにドラッグ&ドロップで出来ますが、
サウンドウェーブを使ったアニメーション等はできません。

なので今回はサウンドウェーブをmayaのtlanslateへもっていく方法を
ご紹介したいと思います。


まずは、サウンドウェーブをmayaからでも読み取れるカタチに
しなければなりませんので、今回はAfter Effectsを使いたいとおもいます。




















コンポジション設定はこんな感じです。
デュレーションは音声ファイルの長さに合わせてください。

タイムラインに音声ファイルをのっけたら
真っ黒な平面を作成し、その上に真っ白な平面を作成します。














こんな感じです。





















次に、音声ファイルを右クリックし
キーフレーム補助 → オーディオをキーフレームに変換
を実行します。









するとオーディオ振幅というレイヤーができ、
右と左と両方のチャンネルがスライダとしてキーフレームに変換されています。

次に、真っ白な平面の不透明度のストップウォッチのアイコンを
Altキーを押しながらクリックします。
すると、エクスプレッションが打てるようになります。














エクスプレッションの渦巻状のアイコンをドラッグして
スライダの上でドロップします。

では、再生してみてください。
サウンドウェーブに合わせて白黒するアニメーションができていると思います。


つまり、この白黒情報をmayaで読み取りtranslateにもっていこうという算段です。


なので、これをレンダリングします。
※注意 後でテクスチャアニメーションで読み込むので
soundWave.[###].png のように連番の前は必ず.にして下さい。

ファイルフォーマットは非可逆圧縮のpngとかをおススメします。



ここからはmayaでの作業
(maya 2013だと一部melがうまく実行されないので(バグ?)
今回はmaya 2011を使っています)














ハイパーシェードからファイルノードを作成します。

ファイルノードに先ほど作成した画像を読み込みます。






















Use Image Sequenceにチェックを入れると連番で画像を読み込んでくれます。
※注意 AEで書きだしたファイルは0から始まるので0フレーム目が
1枚目のテクスチャになっています。
これを変更したい時は紫色になっているImage Numberの
エクスプレッションを変更する必要があります。

次に、スクリプトエディタを開き以下のMELを実行します。

//////////////////////////////////////////////////////
{
    float $value[];
    string $loc[] =`spaceLocator`;
    for($i=開始フレーム;$i<=終了フレーム;$i++){
        currentTime $i;
        $value =`colorAtPoint -u 0.5 -v 0.5 -o A ファイルノード名`;
        setAttr ($loc[0] + ".ty") $value[0];
        setKeyframe ($loc[0] + ".ty");
    }

}
//////////////////////////////////////////////////////


日本語のところは半角英数字に書き換えて使ってください。

ちなみに今回の場合はこんな感じ。

//////////////////////////////////////////////////////
{
    float $value[];
    string $loc[] =`spaceLocator`;
    for($i=0;$i<=899;$i++){
        currentTime $i;
        $value =`colorAtPoint -u 0.5 -v 0.5 -o A file1`;
        setAttr ($loc[0] + ".ty") $value[0];
        setKeyframe ($loc[0] + ".ty");
    }

}
//////////////////////////////////////////////////////


実行してうまくいけばlocatorが現れ、上下に動きます。

これをスケールの値に入れたりなどして
簡単なモーショングラフィックスなんかも作れますね!



今回のMELの実行内容はこんな感じです。

float $value[];
//float型の配列を定義します

string $loc[] =`spaceLocator`;
//ロケーターを作成し、作成されたロケーター名を配列の0番目にいれます

for($i=0;$i<=899;$i++){ 実行 }
//$iの初期値(0)から$i<=899が成り立っている間ループし、毎回ループ終了後に$iに1を足します

currentTime $i;
//タイムスライダを$iに以降します

$value =`colorAtPoint -u 0.5 -v 0.5 -o A file1`;
//MELのcolorAtPointコマンドを実行し色情報を取得します(詳しくはMELコマンドヘルプへ)

setAttr ($loc[0] + ".ty") $value[0];
//ロケーターの移動Yに色情報から取得した値をいれます

setKeyframe ($loc[0] + ".ty");
//ロケーターの移動Yにキーフレームを打ちます



このブログではMELの解説等を一切してなかったので
MELってなんぞ?って方もいらっしゃるかもしれませんが
簡単に言うとMaya専用のスクリプト言語です。
繰り返し処理等をする時はとても便利です。

もし興味のある方は意外と独学でgoogle先生に聞きながらでも出来ると思いますので
チャレンジしてみてください。

2013年6月1日土曜日

フェースにコンストレインする

今回は、動画でチュートリアルを作ってみました。
試験的にささっと作ったので見にくかったり、
分かりにくかったりするかもしれませんがご容赦下さい。


さて今回は、フェースにコンストレインするという事ですが
用途は、服にボタン等のオブジェクトが付いている場合等に使えると思います。

服のボタンはスキンウェイトを振るとオブジェクトが伸びてしまうが
骨にコンストレインすると位置がずれる・・・
なんて状況ありますよね?



ちなみに先に書いておきますが今回の肝は
アトリビュートの転送です。
これを使ってUV座標からワールド座標に追従させます。
まぁ見てもらえば分かると思いますが。


ただ今回は最近発見したばっかりで簡単な検証しかおこなっておりません
もし不具合などありましたらコメント頂けると嬉しいです。



face constraint tutorial from Takayuki Yanagisawa on Vimeo.


質問や感想等ありましたらコメントお願いします!

2013年5月22日水曜日

membrane node

今回は面白いmayaの隠しノード(?)を見つけたのでご紹介します。

サスペンションのバネは現在、記事作成中です。
まぁそのうち書きます・・・


タイトルの通りmayaの隠しノードとはmembrane nodeのことです。

mayaの隠しノードは私の知っている限りいくつかあります。
例えばimplicit nodeです。
これは形のあるnullのようなもので3つの形状があり
更に形状を変更するアトリビュートがあります。

maya2013以降であればノードエディタで簡単に作れますが
それ以前ならMELで

//球体
createNode implicitSphere;

//立方体
createNode implicitBox;

//円錐
createNode implicitCone;

とそれぞれ作ることができます。
まぁ使い道があるのかは知りませんが。


さて、本題のmembrane nodeですが直訳で『皮膜』という意味だそうです。
mesh同士のコリジョンや、布っぽい動きを非シュミレーション、
リアルタイムで動かすことが出来ます。

まぁイメージしにくいと思いますので実際に作ってみましょう。

















まずは、どんな形でも構いませんがメッシュの細かなオブジェクトを用意します。

次にそのオブジェクトを選択し
createMembrane;
とMELを実行します。

すると勝手にmembraneノードがコネクションされたり
meshがコネクションされたりします。

この状態でアトリビュートを弄っても面白いのですが
他のオブジェクトとコリジョン(衝突)させてみましょう。

















先ほどのオブジェクトは置いといて
コリジョンさせたいオブジェクトを新しく作ります。

先ほどのオブジェクトと新しく作ったオブジェクトを選択し
ハイパーシェードでコネクションを見てみます。






















このようにシェイプが表示されると思います。

これをコリジョンさせたいオブジェクトのシェイプノードからmembrane1へ
中ボタンドラッグで引っ張り、その他を選択しコネクションエディタを開きます。






















そしてこのようにworldMeshとcollideMeshをコネクションします。


これで完成です!

あとはお好みでアトリビュートを弄ってみてください。


















するとこんな感じで動かしながらリアルタイムで
コリジョンができたと思います。



単純に乱気流や風圧を弄ってワイヤーフレームをレンダリングして
モーショングラフィックスとかも作れそうですね。

まぁ色々使い道はありそうですが、法線の反転等
弄っているとmeshが崩壊してしまうことも・・・

少々、脆弱性が気になるところが隠されている所以なのでしょうか・・・


まぁ一度、試してみる価値アリです!!

2013年5月6日月曜日

Suspension setup

今回は車やロボットのセットアップの時に使えそうな
サスペンションのリギングをご紹介します。

毎度ですがこれはあくまで一つの方法ですので他にもたくさんの方法があると思いますし
もっとスマートなセットアップがあかもしれませんので悪しからず。


さて何はともあれモデルを作成しましょう。






















こんな感じでしょうか?

今回は見て分かる通り2段階になっております。
段階ごと別オブジェクトでやる方法もありますが今回はくっついています。






















まずハイライトになっている部分をクラスタ化します。
ちなみにクラスタ化の方法は
コンポーネントを選択している状態で
アニメーションタブ → デフォーマの作成 → クラスタ
で出来ます。






















お次はここです。






















最後に残ったここです。

次に三か所にロケーターを配置します。
これは位置を取得する目的と
もしもの時の為のかませです。



場所は画像参照です。
①一番上の中心
②2段目の中心
③一番下の中心

配置出来たらロケーターをトランスフォームのフリーズをして
それぞれ上から順にロケーターとクラスタをペアレントコンストレインします。
※順番は ロケーター → クラスタ です

次にこのようにロケーターを上のロケーターが親になるようペアレント化します。
(上の①、②、③はそれぞれlocator1、2、3になっています)




















そして、ハイパーシェードのユーティリティからプラスマイナス平均を押し作業領域に表示させ
アウトライナでロケーター3つを選択し中ボタンドラックで作業領域に表示させてください。
(↑みたいな感じ)
※一気に3つを持ってくと重なって表示されるのでずらしてください。






















次にlocator1のtranslateYをplusMinusAverage1のinput1D[0]にコネクションします。
※input1Dをクリックしたら自動的にinput1D[0]にコネクションされます。

同様にlocator3のtranslateYをplusMinusAverage1のinput1D[1]にコネクションします。
が!
コネクションエディタではinput1D[1]が表示されずコネクションできません!
色々と原因はありますが今回は別のコネクション方法で・・・


ハイパーシェードの作業領域を見てください。

locator3の右下に右向きの▲があるのでそこを右ドラックしてtranslateYを選択してください。
そのまま、plusMinusAverage1の左下の右向き▲で
また右ドラックしてinput1D[0]を選択してください。

これでコネクションが出来ます。


そして、plusMinusAverage1のoutput1Dからlocator2のtranslateYとコネクションします。

最後にplusMinusAverage1のアトリビュートエディタの操作から平均を選択します。

これで完成です。
試しにlocator1やlocator3のtranslateYを動かしてみてください。
locator2が1と3のちょうど真ん中のポジションに動いてくれます!


あとは他オブジェクトにペアレント化したり、エイムコンストレインすれば
向きなども自由自在になると思います。
(ここは少し考えないともしかしたら難しいかも;)
まぁ分かりにくかったらコメント下さい。



また今度、この記事の内容を使ってサスペンションにばねを付けていみたいと思います。

ではでは

2013年5月4日土曜日

transform node等

前回しれっと使ってしまった『transform node』という単語みなさん理解していたでしょうか。


そもそもMayaはnode(ノード)で出来ています。
そしてノードは大きく分けて二つの種類に分けられます。
DAGノードと、DGのノードです。
詳しくは↓
http://mukaimame-cg.jugem.jp/?eid=100

今回は、その中でもオブジェクトを作る上でかかせない
DAG ノードで DG ノードの一種でもあるtransform nodeとshape nodeについて書きます。










まず、ポリゴンの球を作ってハイパーシェードの入出力コネクションをしてみます。
上のような関係が出ると思います。

左から説明すると、
create node
shape node
shading group node
transform node
となっています。

まず、create nodeですがこれが今回で言う球の形状を決めています。
この中に半径、分割数といった値が入っています。

そしてcreate nodeのoutputからshape nodeのinMeshに繋がれています。
shape nodeではcreate nodeからきた形状を
私達がUI上で見れるように形作ってくれます。
他にもレンダリングの詳細やスムースメッシュなどの値が入っています。
ちなみにUI上でヒストリの削除をすると
このshape nodeのoutMeshの前に繋がれていたノード達が消えていきます。

そしてshading group nodeはおおまかにいうとshape nodeで形作ったものに色を付けています。
ここではディスプレイメントやレンダリングの設定等様々な値が入っています。

そして最後transform nodeですがこれら設定がされたオブジェクトが
どこに配置されるのかどこにピボットがあるのかなどの値が入っています。























さてお次はアウトライナです。
ディスプレイ → シェイプ にチェックを入れています。

見て分かるようにpSpere1には二つのノードによる階層が出来ています。
ちなみに上がtransform node下がshape nodeです。

つまり何が言いたいかというとtransform nodeとshape nodeは親子関係があるということです。

では試しにUI上でpSpere1を選択し、↓キーを押してみて下さい
ちなみに↓キーはpick workのdownのショートカットでひとつ下の階層を選択します。

右下のスクリプトエディタに
// 結果: pPlaneShape1 //
と表示されshape nodeが選択できたかと思います。



・・・と、このような意外と基礎知識は見落としがちです。
これを知っていたら何ができるという具体例はあまり浮かびませんが
これを知っているのと知っていないのとでは制作において大きく違うと思います。

とくにバインド時のshape nodeの繋がりは理解しておくと
後からブレンドターゲットを追加したりなど活用できると思います。


なんか今回は活字ばっかになってしまいましたが参考になればと思います。

2013年4月30日火曜日

matrixについて

諸事情によりだいぶ期間が開きましたが今回はmatrixについてです。

mayaのtransform nodeには移動(translate)、回転(rotate)、スケール(scale)、シアー(shear)
というお馴染みのアトリビュートがありますがこれらを全て合わせたものがmatrixです。
(シアーはあまり使わないですかね・・・)

matrixは16個の数字を持ちます。
ちなみに移動(translate)は3つの数字(X、Y、Z)ですよね。
その数字についてとても分かりやすく解説して下さってるブログをご紹介します。
http://melpystudio.blog82.fc2.com/blog-entry-69.html


さて、ではmatrixをどんな時に使えばいいのかということですが
以前decomposeMatrixに触れたのでそれを使った
グレードアップ版ペアレントコンストレインをご紹介します。
(ちなみに今回はmaya2011で作ってます)















まずはこのようにオブジェクトを2つ用意し、トランスフォームのフリーズをしておきます。

プラグインマネージャでdecomposeMatrix.mllというのをロードしておいて下さい。

次に、ハイパーシェードを開いて下さい。




次に、画面左下のMELのところに
createNode decomposeMatrix;
と打ちこんでEnterキーを押してください。

するとハイパーシェードの作業領域にdecomposeMatrix1というノードが
一つ出来上がったと思います。
もし表示されない場合は
select decomposeMatrix1;
と同じくMELのところにうって入出力コネクションボタンを押してみてください。


ちなみにmaya2013の場合はノードエディタを開きTABキーを押し
decぐらいまで打ったらdecomposeMatrixが出てくるのでそれを押せば出来ます。


decomposeMatrixノードはmatrixの16個数字から移動(translate)、回転(rotate)、
スケール(scale)、シアー(shear)の値に変換してくれるノードです。






















では次にコネクションエディタを開き右側にpCube1
左側にdecomposeMatrix1をロードします。

そしてworldMatrixからinputMatrixへコネクションします。

ちなみにtransformノードにはmatrixが幾つもあるのですが
なぜworldMatrixなのかというとペアレントコンストレインのように
world座標で制御したい為です。






















次に左側にdecomposeMatrix1、右側にpSphere1をロードします。
そしてそのまま
outputTranslateとtranslate
outputRotateとrotate
outputScaleとscale
outputShearとshear
をコネクションします。

これで完成です!


で、なにがグレードアップ版かというとスケール
シアーの値もコンストレインされているという点と
コネクションされている数が全然違うので処理が軽いということです。

ハイパーシェード等で見てもらえば分かると思いますが
通常のペアレントコンストレインは17つコネクションされているのに対し
グレードアップ版ペアレントコンストレインは5つしかコネクションされていません。


今回は簡単な使い方だけでしたがいろいろと使い道はあると思います。
ペアレント化されている子供の階層のワールド座標を取得できるというだけで
夢がひろがりますよね?・・・よね・・・?

はい、ではまぁ色々とチャレンジしてみてください。

2013年4月5日金曜日

補助ボーン

また期間が開いてしまいました。
気持ち的には3日に1投稿くらいしたいのですが
私用で最近なかなか書けませんでした;;


今回は補助ボーンです。
補助ボーンとはスキニングの時の補助として作るボーンのことです。


ちなみにスキニングはボーンでしか行えないと思ってらっしゃるかたも
多いのではないでしょうか。

スキニングはポリゴン等でもバインドできます。
(たしかジョイントは必須になったと思います)

何か厚みのあるものをバインドさせたいときには便利です。
マッスルを使わずに疑似的な筋肉の表現なんかも使えると思います。

まぁ今回は説明しませんが・・・




















こんなものを用意しました。
ただの円柱にボーンをバインドしたものです。
(なんとなくスムースメッシュプレビューにしてあります)




















曲げるとこんな感じです。

ウエイトはインタラクティブで
一番下のジョイント(root)から真ん中のジョイントまでの頂点のウエイトを
一番下のジョイント(root)に対して1、
真ん中のジョイントから一番上の末端ジョイントまでの頂点のウエイトを
真ん中のジョイントに対して1にしてあります。


曲げた真ん中のジョイントに近い部分がポリゴンをえぐってしまっており
滑らかには曲がっていません。




















滑らかに曲がるために、この選択されたエッジは
真ん中のジョイントの半分の値をとってほしいです。




















そこでまず同じポジションにジョイントを新しく作ります。
回転軸は真ん中のジョイントと同じ方向にしておいて下さい。

バインドされたオブジェクトと
バインドしているルートジョイントと
新しく作ったジョイント
この3つを選択した状態で

スキン → スムース スキンの編集 → インフルエンスの追加
をします。

すると後から追加したジョイントもウエイトを持つことができるようになるので
先ほどのエッジの部分の頂点のウエイトを新しく追加したジョイントに対し1にします。


後はこの新しく追加したジョイントに真ん中のジョイントの回転値の半分を
いれてあげれば良い訳です。











こんな感じで乗算除算ノードを使い真ん中のジョイントの回転値に0.5をかけ合わせ
新しいジョイントの回転値にします。
コネクション方法は前の記事でもやってるので省きます。



















するとこんな感じで滑らかに曲がってくれます。



これを応用すれば人型でバインドするのが難しい尻、肩等の調整が
うまくできるのではないでしょうか。

リアル系は素直にマッスルを試す方がいいと思いますが
カートゥーン系のようなキャラクターは良いかもしれません。
(とか書きましたがマッスルに関してはまだまだ勉強中です;;)


以上ですー

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 とかをググってみたらいいと思います。

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

2013年3月16日土曜日

手首の回転を振り分ける

今回は、手首の回転についてです。

手首には曲がりにくい方向があります。














この図で言うと、YやZには回転しやすいですがX方向には曲がりにくいです。
試しに皆さんも手首のやや手前を固定した状態でぐるぐるしてみてください。



これは人間の骨の構造上曲がりにくいのです。
ですが、私達は普段Z方向に物をひねったりしますよね?
例えば、ドアノブを回す時とか・・・

その時は肘から手首に伸びる2本の骨がねじれるようにして曲がっているんです。
イメージつきにくい人は人体の構造や運動学なんか調べてみると良いかもしれません。


つまり、バインド的な問題で言うと
手首の部分は↑のX方向だけ腕の部分も追従して欲しい訳です。


という訳で、今回は疑似的に手首の回転を肘と手首の真ん中くらい(Roll bone)にも振り分けよう
ということです。



今回は腕の部分はIKの制御のみで行うとします。



さて、前回からの記事にも書きましたがIK handleが入っていると
ジョイントの回転値が固定されてしまいます。

そこで、こんなTips













まずはこんな感じにジョイントを配置します。












そして、ロールボーンまでIK handleをいれます。
次にハイパーグラフを開きます。





















するとこのようにeffectorというものが出来ていると思います。
これを選択し、UI上でinsertキーを押します。












Vキーを押しながら、手首までスナップさせます。

すると、IK自体はロールボーンまでしか入れてないのに
手首までIKが入ったような動きをしてくれます。

これでロールボーンと手首は自由に回転値を入れることが出来ます。


後はカンタン!

前回の記事のようにコネクションします。

手首のrigのrotateXをロールボーンのrotateXに、
手首のrigのrotateYとrotateZを手首に入れましょう。


これで、疑似的に手首の回転を作る事が出来ました!!

FK/IK Switch ブレンドカラーを使う方法

今回は前回に引き続きFK/IK Switchの方法についてです。

前回の記事の『ここまでは2つの方法とも一緒です』までは同じです。
ではそこからのお話を。

そういえば、前回詳しく書かなかったのですが
今回の行っている切り替えとは”回転”のことです。
移動やスケールは関係ありません。
回転の値が切り替わればOKなのです。

以上を頭に入れたうえでどぞ。


とりあえずまず、完成形をお見せします。


こんな感じにできればOKです。

何じゃこの画面?という方もいると思いますが
これは、ハイパーシェードの作業領域の部分で
何かオブジェクトを選択して

こんなボタンがハイパーシェードの上のとこにあると思うのですが
真ん中とかをおすと右下に出てくるこれです。


これは何を表示しているかというとノード同士が
どうやって繋がっているのかを表しています。

Maya2013にはこれをもっと見やすくしたノードエディタというものが導入されていますが
今回はハイパーシェードで説明します。

この図のハイライトになっている赤と青のぐるぐるがブレンドカラーです。
これは、ハイパーシェードのユーティリティの中に入っています。

どんな機能があるのかというと、AとBの異なるテクスチャ同士を混ぜ合わせることができ
更に混ざる割合をコントロールすることができます。
詳しくは、Mayaのオンラインヘルプを見てください。


色の管理というのはR、G、Bと3つの値で管理されています。
今回行いたい回転の値というのもX、Y、Zの3つの値で制御されています。
奇遇にも同じ数なのでうまく利用しましょう。




さて、このブレンドカラーはボタンを押せばノードが出来上がるのですが
どうやって使うのかってとこですよね。

このブレンドカラーでコントロールできる値は大きく分けて3つ
1、1つ目のカラー(値は↑の通り3つ入る)
2、2つ目のカラー(値は↑の通り3つ入る)
3、ブレンダー

3は1と2を切り替えるスライダーで0と1で切り替えます。



つまり今回の場合

1、FKのジョイントの回転値
2、IKのジョイントの回転値
3、FK、IK切り替える用のコントローラーの値

となれば良い訳です。


それではまずハイパーシェードの作業領域に
FK用のボーン、IK用のボーン、バインド用のボーン
を表示させます。

表示のさせ方は選択して上のボタンでも良いのですが
ごちゃごちゃしてしまうこともあるので

アウトライナかハイパーグラフのどちらかで表示させ
中ボタンドラック&ドロップで作業領域に表示させましょう。



表示できたらまずはFK用のボーンを中ボタンドラック&ドロップで
ブレンドカラーの上までもっていって下さい。

こんなのが表示されますのでその他を選択してください。
すると、コネクションエディタが開きます。

左がボーン、右がブレンドカラーになっているので
ボーンのrotateとcolor1をそれぞれ選択します。
これでノード同士がコネクションされました。

次にIK用のボーンを選択し今度はコネクションエディタの上の
左側のロードを選択してください。
FK用のボーンからIK用のボーンへノードの表示が変わります。

今度はrotateとcolor2を繋ぎます。

更に、左側にFK、IK切り替える用のコントローラーを表示させ
アトリビュートをblenderと繋ぎます。

アトリビュートは移動値等でも良いですが
私の場合は追加のアトリビュートで0から1のfloatにしています。
理由は上記の通り、ブレンドカラーのblenderは0と1でコントロールされる為です。


そして最後に、今度はブレンドカラーを左側に表示させ
右側にバインド用のボーンを表示させます。

そして、outputからrotateに繋ぎます。


これで完成です!!
(他のジョイントにも同じ動作をしてあげて下さい)




今回の場合はfloatで綺麗に補間されるので、
アニメーションの最中での切り替えが可能になります。


ただ今回書いた内容がすべてではないので
これを応用させ自分の一番使いやすいrigを作ってみてください!!