D日記

ゲーム業界7年目。基本技術ブログですがネタが無い時は雑記ブログ。

MENU

【保存版】ペアレント切り替えリグを作ってみよー【Maya】

久々にリグの記事を書いてみようと思います!

まず「ペアレント切り替えリグ」ってなんだって話なんですが。
武器を左手や右手の子にしたり、ワールドで制御したり・・・と状況によって切り替えられるリグです。

では作っていきますー



今回使用する人型リグ

今回はMox様から人型リグ拝借いたします。
最終的にはUnityにモデルをエクスポートしようと考えていますが、
リグとスケルトンが階層的に入り乱れているので、無駄なノードとかも入っちゃうのは目を瞑っていただければと思います!

f:id:ponta565:20181210184620p:plain

武器モデルの用意

今回は適当な武器モデルを用意し、武器用のジョイントを1本入れてスキニングします。
武器ジョイントを動かせば武器も1:1でついてくるって構造ですね。
メッシュとジョイントの階層構造だけは最低限分ける!
f:id:ponta565:20181210193053p:plain

実際の開発現場では、武器の差し替えなどを考慮してキャラと武器のモデルは分離して管理すると思いますが、今回はあくまで武器切り替えリグの構築がメインなのでそこはご了承ください。

コントローラーの用意

まずは、コントローラー!武器のコントローラーが必要です!
このコントローラーで、武器のアタッチ状態をキーフレーム管理します。

コントローラーを作成したら2重グループ化します。
これは武器リグのアニメーションを行えるようにするのと、トランスフォームをリセットした時に初期位置に戻れるようにする為です。
最終的に「rig_weapon_init」ノードはコンストレイントされます。
f:id:ponta565:20181210232404p:plain

ちなみに、コントローラーは Rigging101 さんからDLしたMELで作成しています。

武器リグで武器ジョイントをコンストレイント

武器リグ > 武器ジョイント の順で選択して、ペアレントコンストレイント。
f:id:ponta565:20181211200839p:plain

これでリグに武器がついてくるようになりましたー

切り替えアトリビュートの追加

今回は、左手・右手・ワールド に親子付できるようにしてみます\(^o^)/
もちろん、コントローラーの数だけ増やしてもいいですよ!

[ Channel Box > Edit > Add Attribute ]
Data Type は Enum にして・・名前を「parent」とかにしてください。
そして、Enum Names に L_Hand , R_Hand , World と入力します。
f:id:ponta565:20181211205132p:plain

そしたらこんな感じでプルダウンメニューが出るようになりますね!
f:id:ponta565:20181211205415p:plain

What is Enum ?
プログラミングとかで使われるもので、列挙体などと呼ばれたりします。
今回は別に深く理解する必要は無いので、
追加した順に 0 , 1 , 2 という整数が割あたっていると考えるだけでOKです!
L_Hand = 0
R_Hand = 1
World = 2


武器リグをペアレントコンストレイントする

①Mox_LeftHand → ②Mox_RightHand → ③Mox_Skeleton → ④rig_weapon_init
の順に選択して、 [ Constraint > Parent Constraint ] を実行
オフセットはオフにしてください。
f:id:ponta565:20181211212507p:plain

すると武器リグの子にあるコンストレイントノードに①「**W0」っていうアトリビュートが3つできたと思います。
全て1になっていると思いますが、これは3つのノードが武器リグを均等に引っ張っている状態になっているのです。
(キャラは原点に戻しました。あとち○こ生えてるみたいですね。)
f:id:ponta565:20181211213055p:plain

試しに「Mox Left Hand W0」以外を0にすると左手に武器が移動したと思います。つまりそういうことですよ!
f:id:ponta565:20181211213702p:plain

conditionノードを使って条件分岐する

今回はこういうことをやりたいわけです。

*W0*W1*W2
L_Hand=1100
R_Hand=1010
World=1001


そしてそれを実現するために、今回はconditionノードを使用します。
(ドリブンキーでも可能ですが今回はシンプルなので使用しません。アニメーションカーブノードだと間違って消してしまうリスクもあるので・・)

まずは、ノードエディタを立ち上げましょう。
そして「武器リグ」と「ペアレントコンストレイントノード」をノードエディタに表示します。
f:id:ponta565:20181211214412p:plain

そしてconditionノードを作成します。
[ノードエディタ上で右クリック長押し > Create Node > Utilities > Condition ] でノードを作成
f:id:ponta565:20181211220424p:plain

conditionノードはプログラミングで言うところのif文に似ています。
今回使用する機能だけをかいつまんでざっくり説明すると下記のような感じです。
f:id:ponta565:20181211221717p:plain

名前!名前は大事です!名前をつけましょう!
今回は「cdn_L_Hand」にしましょう!
f:id:ponta565:20181211222322p:plain

そしてconditionノードのアトリビュートを下記のようにセット
第1項=0の場合に、(1,0,0)という値が出力されます。
f:id:ponta565:20181211223359p:plain

嫌いな人は嫌いなノードグラフです。
画像の通り接続してみましょう。
f:id:ponta565:20181211223618p:plain

成功すれば下記のような挙動になります。
f:id:ponta565:20181211223923g:plain

はい次は複製してそれぞれリネームしてください。
それぞれ第2項の値のみ画像の指示に従って変更。
f:id:ponta565:20181211224434p:plain

そしてまた接続!基本的にさっきと同じ接続で、最終接続先がW1とW2になっただけです。
f:id:ponta565:20181211225308p:plain

ということでこれで完成です!!お疲れ様でしたー
ていうか動画でまとめたほうが早かったなこれ、記事にするのってホント手間・・

youtu.be

最終的な階層構造はこんな感じです。
今回追加した武器リグは「rig_All」にしまってあります。
メッシュ、ジョイント、リグ の階層をきちっと分けるのも大事です!
f:id:ponta565:20181211231850p:plain

まとめ

・多重コンストレイントをかけて、それぞれのウェイトを切り替えると親子切り替えアニメーションを実現できる。
・比較した数値の結果に応じて特定の値を出力するには「condition」ノードが便利。
・今回のモーションデータはこちらにアップしますので、構造で迷ったときなどに覗いてみてくださいー

www.dropbox.com


久々にこんな長い記事書きましたぁ。
この記事が役に立ったら、広告をクリックして私にアドセンス収入をください(真剣)

【おまけ】Unity上への出力と圧縮設定について

今回作ったリグでモーションを一つ作ってみましたー
露骨に武器を持ち替えたりワールドにぶっ刺したりするモーションですw
www.youtube.com

ではこれをFBXで書き出してUnityにインポートします。
左:モデル書き出し設定。右:モーション書き出し設定。
モーションファイルにはメッシュデータは不要なので無駄な書き出しはしないようにしませう。
f:id:ponta565:20181212202950p:plain

そしてFBXをUnityプロジェクトにインポートし、アニコンを新規作成してモーションを割り当てます。
f:id:ponta565:20181212202438p:plain

Maya上と同じ見た目で出力されましたね!
しかしよくよく見るとぉ・・・
youtu.be

さてここで注意点が1つあります。
実際の武器モデルはキャラクターの手の子にはなっていません。
ワールド空間の移動回転によって、手の子になっているように見えているだけなのです。
Maya上では問題ありませんが、UnityなどのゲームエンジンにFBX形式でモーションをインポートすると、モーションの圧縮率によっては手と武器が離れてしまう場合があります。
そこだけ注意が必要です(彼らは本当の親子ではないのです)。


Compression(圧縮)の値を上げることで、アニメーションが崩れていく例。
f:id:ponta565:20181212204810p:plain

映像では圧縮無しでもいいかもしれませんが、ゲームだとメモリを圧迫するので、確実に圧縮をかけなければいけません。マストです。
アニメーションが崩れないギリギリを攻めていくのが良いかもしれませんが、1つ1つのモーションに対して全てやるのはしんどいので、基本的には(1,1,1)で良いでしょう。
それでも崩れる場合は、値を下げていけば良いです。


まぁ市販のゲームでも、キャラクターが持っているアイテムが、手の上を若干プルプル滑ってたりするのが見られますので、そのへんはある程度許容してもいいと思いますよ・・・
【イベントシーン】#03 テイルズオブゼスティリア(Tales of Zestiria)(3:02~)


手と武器の関係を完全なる親子にしたい場合は、
・ランタイム上で、スクリプトによる親子関係の制御。
・ランタイム上で、スクリプトによって武器と手をコンストレイント。
 → 武器のワールドトランスフォームをハンドのワールドトランスフォームと一致させる。
などの対処が必要ですね!