Mayaでスペーススイッチ(Space Switch)、スペース切り替えの方法を解説します。
このスペーススイッチはアニメーション作成にとても便利な機能です。この機能がない場合にはLocatorとコンストレインを駆使してアニメーションを何度もBakeしたりと色々と面倒な作業を強いられます。
しかし、スペーススイッチ(Space Switch)出来るリグを使用するとローカルスペースからグローバルスペースへ等とアニメーションをつけやすいスペースへ変更することができます。
わかりやすい例としてはIKの腕のスペースをグローバルにすれば机に手をつけたまま固定することができます。また、頭のスペースに切り替えれば頭を動かしても手は頭の一点に固定されたままにすることができます。腰や胸に固定したい場合も切り替えるスペースを用意しておけば可能です。
FKの場合はどうでしょうか。例えばウォークサイクルのアニメーションを付ける場合に頭のスペースをグローバルにしておけば腰や胸の動きに影響されずにまっすぐ前を見据えたままのアニメーションを用意に作成することが出来ます。
フェイシャルアニメーションの場合の目の動きは基本的にはグローバルで作成するのが良いとされています。それは頭が多少動いても視線は同じところを見続けているからです。それに目の動きが頭の動きの影響を受けてしまうと頭の動きを少し修正するだけでも、目の動きをすべてやりなおさなければならなくなります。
この記事では「頭の回転のスペースを切り替える方法」の解説をします。それは頭の回転のスペーススイッチを作成することは頭の位置はローカルのjoint階層と同じ位置にありながら回転はグローバルにするというすこしやっかいな要素があるからです。
頭の回転のスペーススイッチを作成する -準備編-
この記事では頭の回転を「ワールド(何にも影響されない)」と「首の子階層(普通のFKジョイント(ローカル)の階層)」と「腰の子の階層」の3つに切り替えられるようにします。
まずはjointを下から順番にまっすぐ上に「body_Jnt」「neck_Jnt」「head_Jnt」「head_Tip_Jnt」という名前で引きます。そして、これらのjointを「Jnt_Grp」というjointのグループを作成しそこに入れます。リグを作る上でのjointとコントローラーとGeometry(今回の記事の例ではありません)にグループを分けてください。また本来はスキニングするjointとリグのコントローラーをつけるjointをそれぞれ用意してそれらを接続して使わなければならないのですが、この記事ではリグ用のコントローラーをつけるjointしか使用しません。そのあたりの話に興味がある方はは以前書いた記事を参考にしてみてください。

また、joint orientやrotate orderについては今回の記事では無視していますが、大事なことなのでよくわからない方は以前書いた記事を読んでみてください。


また、今回はすべてnurbs Circleのコントローラーを使用しましたが、Mayaでコントローラーを作成する方法はこちらの記事をご覧ください。

次に「Rig_Grp」というグループを作成してその中にコントローラーを配置します。まず原点にnurbs Circle等で「root_Ctrl」を作成します。同じ位置(「body_Jnt」の位置)に少し小さなnurbs Circleのコントローラーを作成します。「neck_Jnt」の位置に「neck_Ctrl」というコントローラーを、そして、「head_Jnt」の位置に「head_Ctrl」というコントローラーそれぞれを配置します。jointとコントローラーを配置すると以下の画像のようになります。

jointとコントローラーの配置が終わったら階層を整えます。
「root_Ctrl」の子に「body_Ctrl」を入れ、その子に「neck_Ctrl」を配置してjointと同じ親子関係にします。
しかし、「head_Ctrl」にはスペーススイッチ(Space Switch)を作成するので「neck_Ctrl」の子にしてはいけません。ここが第1のポイントです。「root_Ctrl」の子にしますが、「head_Ctrl」の上の階層にlocator(この記事では目で確認できるようにlocatorを使用していますが、本来は簡単に選択されないようにempty group(空グループ)を使用してください。)を2つ作成します。それぞれ「attach_loc」と「follow_loc」とします。これらはもちろん「head_Jnt」にスナップさせて配置します。この「head_Ctrl」の上に2つのLocator(empty group)を置くのが第2のポイントです。作成したコントローラーすべてにModify > Freese Transformationsをして数値を0にしておくことを忘れないようにしましょう。
そして「Rig_Grp」の子に新たに「space_GRP」を作成します。そしてその階層にスペーススイッチで利用するLocator(empty group)をその数だけ作成(今回は3つ)します。名前はそれぞれのスペースの名前にします。ここでは「world」と「neck」と「body」としました。これらの3つのLocatorの位置はもちろん「head_Jnt」のところです。

ここまですべての配置は上の画像のような階層構造になります。これでスペーススイッチを作成する準備が整いました。
頭の回転のスペーススイッチを作成する -組み込み編-
スペース切り替えAttributeの追加
それでは実際にスペーススイッチをリグに組み込みます。
「head_Ctrl」にModify > Add Attributeで切り替えスイッチを追加します。

追加された切り替えスイッチ(選択式)は下の画像のようにChannnel BoxとAttribute Editorで表示されます。

「body_Jnt」と「neck_Jnt」と「neck_Jnt」にコントローラーつける
まずはjointにコントローラーをつけます。ここは普通にjointにコントローラーをつけるだけの作業です。難しいところは何もありません。「body_Ctrl」を選択してから「body_Jnt」を選択します。そしてConstrain > Parent(Maintain offsetにチェックを入れます)。次に「neck_Ctrl」を選択してから「neck_Jnt」を選択します。そしてConstraint > Orient(Maintain offsetにチェックを入れます)。
つづけて「head_Ctrl」を選択してから「head_Jnt」を選択します。そしてConstraint > Orient(Maintain offsetにチェックを入れます)。

「space_GRP」の中のLocator(empty group)をコンストレイン
「space_GRP」の中の「world」と「neck」と「body」のスペースを得ます。つまり、「world」と「neck」と「body」のそれぞれを得たいスペースにコンストレインします。
「world」は全く影響されないワールドスペースなのでコンストレインする必要はありません。
「neck」は「neck_Ctrl」にParent Constrainします。
「body」は「body_Ctrl」にParent Constrainします。
これで各々がスイッチしたいスペースを得ることができました。

「head_Ctrl」の位置を得る
ここからが本番です。「head_Ctrl」がちゃんと「head_Jnt」の位置にあるようにします。
最初に「head_Jnt」を選択してから「attach_loc」を選択します。そしてConstrain > Parent(Maintain offsetにチェックを入れます)。

異なったスペースの回転を得る
位置を得ることが出来たので次は回転を得るための設定です。
ここでは3つスペースの切り替えが出来るので3つにコンストレインします。
3つのスペースである「world」と「neck」と「body」を順番に選択します。最後に「follow_loc」を選択してConstraint > Orinet(Maintain offsetにチェックを入れます)。

Set Driven Key でスペーススイッチ(スペース切り替え出来るようにする)
これで3つにOrient Constrainできましたが、このままでは3つすべて同時にConstrainされているためスペーススイッチで選択されたものに切り替えるためにはSet Driven Keyで設定してやる必要があります。
「animation」メニューに変えてKey > Set Driven Key > Set…□ でSet Driven Key Windowを開きます。

[Driver]側に「head_Ctrl」を読み込み、「Space」をハイライトさせます。
[Driven]側に「follow_loc_orientConstraint1」を読み込み、「World W0」「Neck W1」「Body W2」をハイライトさせます。
「head_Ctrl」の「Space」を「world」にしたときに「follow_loc_orientConstraint1」の値をWorld W0→1、Neck W1→0、Body W2→0にして、Set Driven Key Window の「Key」を押します。
以下、「head_Ctrl」の「Space」を「neck」にしたときに「follow_loc_orientConstraint1」の値をWorld W0→0、Neck W1→1、Body W2→0にして、Set Driven Key Window の「Key」を押します。
「head_Ctrl」の「Space」を「body」にしたときに「follow_loc_orientConstraint1」の値をWorld W0→0、Neck W1→0、Body W2→1、Set Driven Key Window の「Key」を押します。

これで完成です
これで頭の回転をグローバルにしたり、「neck_Ctrl」の子の状態である普通のFK状態にしたり、「body_Ctrl」と同じスペースにしたりとスペーススイッチ(スペース切り替え)出来るようになりました。
IKのスペーススイッチをする方法も今回の方法が参考になると思います。
それだけでなく、アニメーションをつけるときにLocatorでいろいろやっているときにコンストレインでサイクルの問題が起こってしまう場合があります。そのサイクルの問題を回避するヒントになるかもしれません。
今回の記事が気に入っていただけた場合、ぜひとも他の記事もチェックしてみてください。Mayaのリギングに関する記事をまとめたページです。




コメント