久々にリグの記事を書いてみようと思います!
まず「ペアレント切り替えリグ」ってなんだって話なんですが。
武器を左手や右手の子にしたり、ワールドで制御したり・・・と状況によって親を切り替えられるリグです。
では作っていきますー
- 今回使用する人型リグ
- 武器モデルの用意
- コントローラーの用意
- 武器リグで武器ジョイントをコンストレイント
- 切り替えアトリビュートの追加
- 武器リグをペアレントコンストレイントする
- conditionノードを使って条件分岐する
- まとめ
- 【おまけ】Unity上への出力と圧縮設定について
今回使用する人型リグ
今回はMox様から人型リグ拝借いたします。
最終的にはUnityにモデルをエクスポートしようと考えていますが、
リグとスケルトンが階層的に入り乱れているので、無駄なノードとかも入っちゃうのは目を瞑っていただければと思います!
武器モデルの用意
今回は適当な武器モデルを用意し、武器用のジョイントを1本入れてスキニングします。
武器ジョイントを動かせば武器も1:1でついてくるって構造ですね。
メッシュとジョイントの階層構造だけは最低限分ける!
実際の開発現場では、武器の差し替えなどを考慮してキャラと武器のモデルは分離して管理すると思いますが、今回はあくまで武器切り替えリグの構築がメインなのでそこはご了承ください。
コントローラーの用意
まずは、コントローラー!武器のコントローラーが必要です!
このコントローラーで、武器のアタッチ状態をキーフレーム管理します。
コントローラーを作成したら2重グループ化します。
これは武器リグのアニメーションを行えるようにするのと、トランスフォームをリセットした時に初期位置に戻れるようにする為です。
最終的に「rig_weapon_init」ノードはコンストレイントされます。
ちなみに、コントローラーは Rigging101 さんからDLしたMELで作成しています。
武器リグで武器ジョイントをコンストレイント
武器リグ > 武器ジョイント の順で選択して、ペアレントコンストレイント。
これでリグに武器がついてくるようになりましたー
切り替えアトリビュートの追加
今回は、左手・右手・ワールド に親子付できるようにしてみます\(^o^)/
もちろん、コントローラーの数だけ増やしてもいいですよ!
[ Channel Box > Edit > Add Attribute ]
Data Type は Enum にして・・名前を「parent」とかにしてください。
そして、Enum Names に L_Hand , R_Hand , World と入力します。
そしたらこんな感じでプルダウンメニューが出るようになりますね!
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 ] を実行
オフセットはオフにしてください。
すると武器リグの子にあるコンストレイントノードに①「**W0」っていうアトリビュートが3つできたと思います。
全て1になっていると思いますが、これは3つのノードが武器リグを均等に引っ張っている状態になっているのです。
(キャラは原点に戻しました。あとち○こ生えてるみたいですね。)
試しに「Mox Left Hand W0」以外を0にすると左手に武器が移動したと思います。つまりそういうことですよ!
conditionノードを使って条件分岐する
今回はこういうことをやりたいわけです。
*W0 | *W1 | *W2 | |
L_Hand=1 | 1 | 0 | 0 |
R_Hand=1 | 0 | 1 | 0 |
World=1 | 0 | 0 | 1 |
そしてそれを実現するために、今回はconditionノードを使用します。
(ドリブンキーでも可能ですが今回はシンプルなので使用しません。アニメーションカーブノードだと間違って消してしまうリスクもあるので・・)
まずは、ノードエディタを立ち上げましょう。
そして「武器リグ」と「ペアレントコンストレイントノード」をノードエディタに表示します。
そしてconditionノードを作成します。
[ノードエディタ上で右クリック長押し > Create Node > Utilities > Condition ] でノードを作成
conditionノードはプログラミングで言うところのif文に似ています。
今回使用する機能だけをかいつまんでざっくり説明すると下記のような感じです。
名前!名前は大事です!名前をつけましょう!
今回は「cdn_L_Hand」にしましょう!
そしてconditionノードのアトリビュートを下記のようにセット
第1項=0の場合に、(1,0,0)という値が出力されます。
嫌いな人は嫌いなノードグラフです。
画像の通り接続してみましょう。
成功すれば下記のような挙動になります。
はい次は複製してそれぞれリネームしてください。
それぞれ第2項の値のみ画像の指示に従って変更。
そしてまた接続!基本的にさっきと同じ接続で、最終接続先がW1とW2になっただけです。
ということでこれで完成です!!お疲れ様でしたー
ていうか動画でまとめたほうが早かったなこれ、記事にするのってホント手間・・
youtu.be
最終的な階層構造はこんな感じです。
今回追加した武器リグは「rig_All」にしまってあります。
メッシュ、ジョイント、リグ の階層をきちっと分けるのも大事です!
まとめ
・多重コンストレイントをかけて、それぞれのウェイトを切り替えると親子切り替えアニメーションを実現できる。
・比較した数値の結果に応じて特定の値を出力するには「condition」ノードが便利。
久々にこんな長い記事書きましたぁ。
この記事が役に立ったら、広告をクリックして私にアドセンス収入をください(真剣)
【おまけ】Unity上への出力と圧縮設定について
今回作ったリグでモーションを一つ作ってみましたー
露骨に武器を持ち替えたりワールドにぶっ刺したりするモーションですw
www.youtube.com
ではこれをFBXで書き出してUnityにインポートします。
左:モデル書き出し設定。右:モーション書き出し設定。
モーションファイルにはメッシュデータは不要なので無駄な書き出しはしないようにしませう。
そしてFBXをUnityプロジェクトにインポートし、アニコンを新規作成してモーションを割り当てます。
Maya上と同じ見た目で出力されましたね!
しかしよくよく見るとぉ・・・
youtu.be
さてここで注意点が1つあります。
実際の武器モデルはキャラクターの手の子にはなっていません。
ワールド空間の移動回転によって、手の子になっているように見えているだけなのです。
Maya上では問題ありませんが、UnityなどのゲームエンジンにFBX形式でモーションをインポートすると、モーションの圧縮率によっては手と武器が離れてしまう場合があります。
そこだけ注意が必要です(彼らは本当の親子ではないのです)。
Compression(圧縮)の値を上げることで、アニメーションが崩れていく例。
映像では圧縮無しでもいいかもしれませんが、ゲームだとメモリを圧迫するので、確実に圧縮をかけなければいけません。マストです。
アニメーションが崩れないギリギリを攻めていくのが良いかもしれませんが、1つ1つのモーションに対して全てやるのはしんどいので、基本的には(1,1,1)で良いでしょう。
それでも崩れる場合は、値を下げていけば良いです。
まぁ市販のゲームでも、キャラクターが持っているアイテムが、手の上を若干プルプル滑ってたりするのが見られますので、そのへんはある程度許容してもいいと思いますよ・・・
【イベントシーン】#03 テイルズオブゼスティリア(Tales of Zestiria)(3:02~)
手と武器の関係を完全なる親子にしたい場合は、
・ランタイム上で、スクリプトによる親子関係の制御。
・ランタイム上で、スクリプトによって武器と手をコンストレイント。
→ 武器のワールドトランスフォームをハンドのワールドトランスフォームと一致させる。
などの対処が必要ですね!