MayaでFKとIKのブレンド(切り替え)方法を解説します。ブレンドと切り替えについては人それぞれ好みがあると思います。私は補間してくれるブレンドは嫌いではありませんが、キーを沢山打たなくてはならないアニメーターとしては数値をいれてキーを打つ(ブレンドの場合)という手間がかかるので切り替えのほうが好ましいという意見も痛いほどよくわかります。どちらにしてもやり方は同じです。違うのは最後のFKとIKを選択するチャンネルボックスを数値入力にしてブレンド方式にするか、FKとIKのプルダウンメニューにするかの違いだけです。
また、この記事はコントロールリグを作成する方法を解説したものです。スキニングしたキャラクターにいきなりこのようなことをしないでくささい。詳しくは以前の記事を参考にしてください。
左腕のjointを作成
左腕のjointを作成します。この左腕をFKとIKのブレンド(切り替え)できるようにします。
名前は「L_upperArm_Jnt」「L_elbow_Jnt」「L_hand_Jnt」「L_handTip_Jnt」としました。
joint orientを揃えてください。揃える方法やどういったルールに基づいて揃えるかは以前の記事に書きましたので参考にしてください。
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」 でグループ化します。
コントローラーの作成
リグで使うコントローラーを作成します。
コントローラーの作成方法については以前の記事を参考にしてください。
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」というスライダーがあるのでそれを左右に動かして動作を確認してください。
このようにFKとIKの間を動いていれば成功です。
切り替えスイッチにするには
ブレンドではなくて切り替えのほうが良いという場合は「FK_IK」を選択してアトリビュートを追加するときに次のように変更します。
Data Typeを「Enum」にします。
Enum Namesを「IK」「FK」にします。上にあるほうが「0」で下が「1」です。どちらの数値がIK側なのか確認してから入力してください。この場合はIK側が「0」でした。
次回は
次回はこのFKとIKのマッチング(位置合わせ)です。
マッチング(位置合わせ)ができればこのFKとIKのブレンド(切り替え)がより使いやすくなります。
今回の記事が気に入っていただけた場合、ぜひとも他の記事もチェックしてみてください。Mayaのリギングに関する記事をまとめたページです。
コメント