MayaでFKとIKブレンド(切り替え)方法

FK_IK_blendMayaでRigging

MayaでFKとIKのブレンド(切り替え)方法を解説します。ブレンドと切り替えについては人それぞれ好みがあると思います。私は補間してくれるブレンドは嫌いではありませんが、キーを沢山打たなくてはならないアニメーターとしては数値をいれてキーを打つ(ブレンドの場合)という手間がかかるので切り替えのほうが好ましいという意見も痛いほどよくわかります。どちらにしてもやり方は同じです。違うのは最後のFKとIKを選択するチャンネルボックスを数値入力にしてブレンド方式にするか、FKとIKのプルダウンメニューにするかの違いだけです。

また、この記事はコントロールリグを作成する方法を解説したものです。スキニングしたキャラクターにいきなりこのようなことをしないでくささい。詳しくは以前の記事を参考にしてください。

MayaでRigging(Basic編)
「MayaでRigging」このシリーズではMayaでのリギングについて書きます。リギングといっても様々なレベルがあり、人によって認識がバラバラです。「リグなんてものは簡単だ」という人もいれば、「リグはとても難しい」という人もいます。これ...
スポンサーリンク

左腕のjointを作成

左腕のjointを作成します。この左腕をFKとIKのブレンド(切り替え)できるようにします。

名前は「L_upperArm_Jnt」「L_elbow_Jnt」「L_hand_Jnt」「L_handTip_Jnt」としました。

joint orientを揃えてください。揃える方法やどういったルールに基づいて揃えるかは以前の記事に書きましたので参考にしてください。

MayaでRigging(joint orient編)
今回はjoint orient編です。キャラクターをバインドする前にjointをきれいな状態にしなければなりません。そうしないと後々やっかいなこと(問題ない場合もあるのでリガーがいない現場によってはこのようなことを考慮しないところも‥)に...

jointの複製

「L_upperArm_Jnt」 を複製します。Edit > Duplicate(Ctrl+D)します。

名前は 「L_upperArm_fk_Jnt」「L_elbow_fk_Jnt」「L_hand_fk_Jnt」「L_handTip_fk_Jnt」 としました。

さらにもう一本Duplicateします。

名前は 「L_upperArm_ik_Jnt」「L_elbow_ik_Jnt」「L_hand_ik_Jnt」「L_handTip_ik_Jnt」 としました。

名前を見ればわかるように「〇〇_fk_Jnt」はFK用のjointです。「〇〇_ik_Jnt」はIK用のjointです。

jointをグループにまとめる

これまでに作成した3本のjointを「Jnt_Grp」というグループにまとめます。

「L_upperArm_Jnt」と「L_upperArm_fk_Jnt」と「L_upperArm_ik_Jnt」を選択して「Ctrl + G」 でグループ化します。

コントローラーの作成

リグで使うコントローラーを作成します。

コントローラーの作成方法については以前の記事を参考にしてください。

Mayaでコントローラー作成
Mayaを長年使ってきて疑問に思うことがあります。それは「なぜこんな(簡単な、技術的に難しいわけでもない)ことが標準機能として搭載されていないのか?」ということです。その筆頭格といえるのがリグのコントローラーを作成する機能です。このことこ...

FKコントローラーの作成

まずはFK用のコントローラーを作成します。

ここではnurbsCircleを使用します。

nurbsCircleを作成してチャンネルボックスの「INPUTS > makeNurbsCircle1」の「Normal X」に「1」を入れてください。「Normal Y」の値は「0」にしてください。するとjointと同じ方向にCircleが向きます。Edit > Delete by Type > History(Alt + Shift + D)でヒストリを消しておいてください。

次に「Ctrl + V」でスナップさせながらnurbsCircleを「L_upperArm_fk_Jnt」の所へ移動させます。

「Outliner」のDisplayからShapesにチェックを入れます。これでシェイプノードが表示されるようになります。

nurbsCurveのシェイプノードを選択し、次にCtrlキーを押しながら「 L_upperArm_fk_Jnt 」を選択します。その後MELのコマンドラインから

parent -r -s

と入力してEnterキーを押すと「L_upperArm_fk_Jnt」のシェイプノードが先程のnurbsCircleになります。 ゴミとして残ったトランスフォームノードは消しておいてください。

同様に「L_elbow_fk_Jnt」と「L_hand_fk_Jnt」についても同様にコントローラーをつけてください。

IKコントローラーの作成

IKコントローラーを作成する前にIKハンドルを作成します。

Riggingメニューに変えてから、Skelton > Create IK Handleの□(オプション)を開きます。

Current solverを「Rotate-Plane Solver」にします(Reset Toolの設定です)。

Outlinerから 「L_upperArm_ik_Jnt 」と 「L_hand_ik_Jnt」 をCtrlキーを押しながら選択します。

するとIKハンドルが作成されます。

もし、IKハンドルを動かしてもjointが意図した方向に曲がらなかったり、全く曲がらない場合はRiggingメニューのSkelton > Set Preferred Angleで優先角を設定しないといけません。

「L_elbow_ik_Jnt」を曲げたい方向にちょっとだけ曲げてから、 RiggingメニューのSkelton > Set Preferred Angle で優先角を設定します。そのあとは「L_elbow_ik_Jnt 」のrotateの値を「0」にもどします。

これできちんと曲がるようになったはずです。

手のコントローラーにはnurbsカーブのボックス「L_hand_ik_Ctrl」を使用しました。ピボットを手首の位置にあわせて設置しました。Modify > Freese Transformations(デフォルトの設定)でコントローラーの初期位置を「0」に設定します。

また、「Pole Vector」用に球のnurbsカーブ「L_arm_vector」を使用しました。まず肘の位置にスナップさせてからまっすぐ後ろに移動させてそこを初期位置にしました。こちらも Freese Transformationsします。

「L_arm_vector」 を選択し、次に左腕のIKハンドルを選択してConstrain > Pole Vectorをします。これでIKハンドルの設定ができました。

このIKハンドルを「L_hand_ik_Ctrl」で制御できるようにします。

「L_hand_ik_Ctrl」 を選択し、次に左腕のIKハンドルを選択してConstrain > Pointをします。

これで「L_hand_ik_Ctrl」でIKハンドルを制御できるようになりました。

次に「L_hand_ik_Ctrl」を選択肢、次に左手首の「L_hand_ik_Jnt」を選択してConstrain > Orientをします。すると 「L_hand_ik_Ctrl」を回転させると左手首 (「L_hand_ik_Jnt」)が回転するようになります。

最後にFKとIKの切り替えようのコントローラーを作成します。

「FK/IK」という文字を使用しました。この文字のコントローラーの作成方法を少しだけ説明します。名前は「FK_IK」としました。

Create > Typeで文字作成できます。

そこで作成した文字をModify > Convert > Type to Curveでカーブに変換できます

変換したカーブは過去の記事を参照にしてコントローラーにしてください。

FKとIKのブレンド

ここからついに本題(FKとIKのブレンド)に入ります。

「〇〇_Jnt」のjointを「〇〇_fk_Jnt」に合わせるか、それとも「〇〇_ik_Jnt」に合わせるかの割合をブレンドして決めます。

blendColorsノード

ブレンドするには「blendColors」というノードを使います。

blendColorsノードにはColor1(R,G,B)とColor2(R,G,B)という値を入れることが出来ます。このRGBをX,Y,Zと読み替えて利用します。それをBlenderという「0~1」の値でブレンドします(0.5ならColor1が50%、Color2が50%)。

Node Editorでノードを組む

Node Editorに「L_upperArm_Jnt」と「L_upperArm_fk_Jnt」と「L_upperArm_ik_Jnt」を読み込みます(真ん中ボタンドラッグで読み込めます)。Node Editor上でTABキーを押して「blendcolors」と打ち込む途中でリストが出てくるので「blendColors」を選択して読み込みます。

次に上の画像のようにそれぞれを接続します。「unitConversion」というノードは勝手にできます。上の画像だと見にくいので下に接続したものを記しておきます。

L_upperArm_ik_Jnt.RotateX ----> blendColors.Color1.Color1R
L_upperArm_ik_Jnt.RotateY ----> blendColors.Color1.Color1G
L_upperArm_ik_Jnt.RotateZ ----> blendColors.Color1.Color1B

L_upperArm_fk_Jnt.RotateX ----> blendColors.Color2.Color2R
L_upperArm_fk_Jnt.RotateY ----> blendColors.Color2.Color2G
L_upperArm_fk_Jnt.RotateZ ----> blendColors.Color2.Color2B

blendColors.Output.OutputR ----> L_upperArm_Jnt.RotateX
blendColors.Output.OutputG ----> L_upperArm_Jnt.RotateY
blendColors.Output.OutputB ----> L_upperArm_Jnt.RotateZ

これを「L_elbow_Jnt」と「L_elbow_fk_Jnt」と「L_elbow_ik_Jnt」についても同様に行います。

FK / IKブレンド(切り替え)アトリビュートを追加する

「FK / IK」という文字をコントローラーにした「FK_IK」コントローラーにModify > Add Attribute…でアトリビュートを追加します。

その前に「visibility」以外はいらないのでチャンネルボックスで「visibility」以外を選択してチャンネルボックスのChannels > Lock and Hide Selectedで消してしまいます。

Long name:を「FK_to_IK」にして、Data Typeは「float」、Minimum:は「0」でMaximum:は「1」、Default:は「0」にしてOKを押します。

Node Editorで「FK_IK」をblendColorsに接続する

再びNode Editorを立ち上げて、「FK_IK」の「FK_to_IK」と2つあるblendColorsの「Blender」に接続します。

動作の確認

「FK_IK」のAttribute Editorを開きます。

そこのExtra Attributeのなかに追加した「FK_to_IK」というスライダーがあるのでそれを左右に動かして動作を確認してください。

赤がIK、水色が腕のjoint、黄色がFK

このようにFKとIKの間を動いていれば成功です。

切り替えスイッチにするには

ブレンドではなくて切り替えのほうが良いという場合は「FK_IK」を選択してアトリビュートを追加するときに次のように変更します。

Data Typeを「Enum」にします。

Enum Namesを「IK」「FK」にします。上にあるほうが「0」で下が「1」です。どちらの数値がIK側なのか確認してから入力してください。この場合はIK側が「0」でした。

次回は

次回はこのFKとIKのマッチング(位置合わせ)です。

マッチング(位置合わせ)ができればこのFKとIKのブレンド(切り替え)がより使いやすくなります。

Follow me!

コメント

PAGE TOP
タイトルとURLをコピーしました