2021/03/18
wtAddMatrixを使用したフェイシャルリグTips
こんにちは。
BACKBONEの田淵です。
今回は、wtAddMatrixノード(以降wtAddMatrix)に関する内容となります。
本記事では、wtAddMatrixの説明とフェイシャルリグでの使用例をご紹介したいと思います。
1.wtAddMatrixの使用例
こちらは顎の動き(デフォーム)に追従するコントローラ(Cone)にwtAddMatrixを使用しています。デフォームへの追従手法としては、
- 追従させるメッシュやサーフェイスを作成し、Follicleを使用して追従させる。
- 追従させるメッシュやサーフェイスを作成し、メッシュやサーフェイスに追従するConstraintを作成して追従させる。
など幾つかありますが、wtAddMatrixではメッシュやサーフェイス(以降Plane)は必要ありません。
※追従時のダブルトランスフォームの解消方法については割愛します。
下の動画は、wtAddMatrix、Follicle、Constraintを比較したものです。
唇の中心にあるコントローラ(下側のマニュピレーター)を
上唇と下唇の中間の位置で追従させたい場合、
FollicleやConstraintの場合では口を開けた際に追従させるためのPlaneがないため
上唇と下唇を繋ぐPlaneなどを作成する必要がありますが、
wtAddMatrixの場合はPlaneに依存しないため必要ありません。
またFollicleやConstraintの場合では、
Planeがデフォームによる影響を受けているため意図しない回転が発生していますが、
wtAddMatrixの場合は、回転の挙動が安定しています。
なぜwtAddMatrixは回転の挙動が安定するのでしょうか?
wtAddMatrixについて詳しく見ていきましょう。
2.wtAddMatrixとは
wtAddMatrixの前に、addMatrixについてご紹介します。
addMatrixは入力されたMatrixの和を出力します。
A、B、Cの形状を例にご紹介します。
NodeEditorでaddMatrixを作成し、AとBのMatrixをaddMatrixのmatrixInに接続します。
addMatrixの出力をdecomposeMatrixを使用してTranslate、Rotateに変換し、Cに接続します。
<補足>
addMatrixを作成した時点では、matrixInアトリビュートはConnectionEditorに表示されません。
スクリプトまたはNodeEditorを使用して下記の方法で接続します。
- addMatrixを選択します。
- 右クリックして表示されるメニューのShow all atributesを選択します。
- AのMatrixをaddMatrixのmatrixIn[0]に接続します。
- addMatrixの右上にあるアイコンをクリックし、表示を切り替えてweightIn[1]を表示させます。
- BのMatrixをaddMatrixのmatrixIn[1]に接続します。
これで準備が整いましたので、次はwtAddMatrixについてご紹介します。
wtAddMatrixはaddMatrixの入力にウェイトを設定することができます。
また、入力されたMatrixとウェイト値で乗算したMatrixの和を出力します。
下図では、AとBにweightアトリビュートを追加してwtAddMatrixのweightInに接続しています。
CにはweightA、weightBアトリビュートを追加して、AとBのweightを接続しています。
ウェイトによる挙動を確認してみます。
0フレームから10フレームで、AのWeghtアトリビュートに0→1、
BのWeightアトリビュートに1→0とアニメーションキーを設定して再生してみます。
PairBlendやConstraintで切り替えたような挙動になります。
次の項目では、実際にリグでどのように使用するかをご紹介します。
3.デフォームのウェイトをwtAddMatrixのウェイトで使用する
① 下準備として、head、upJaw(上顎)、lowJaw(下顎)のジョイントを作成します。
これらの骨に顔のジオメトリをバインドします。
② コントローラー(Cone)を作成して、追従させたい位置に配置します。
※名前を「ctrl」にしています。
③ Transformノードを3つ作成し、
「ctrl_def」、「ctrl_upJaw」、「ctrl_lowJaw」と名前を変更します。
この3つのノードをctrlと同じ位置(移動、回転、スケール全て同じ値)に配置します。
④ ctrl_upJawをupJawに、ctrl_lowJawをlowJawにペアレントします。
⑤ ctrl_def、ctrl_upJaw、ctrl_lowJawにWeightアトリビュートを追加します。
⑥ wtAddMatrix、decomposeMatrixを作成して下図のように接続します。
今回はWorldMatrixを使用していますが、
ローカル化する場合は必要なローカルMatrixを取得して接続してください。
⑦ 各Weightアトリビュートの値を設定します。
wtAddMatrixの各weightアトリビュートには、スキニングのウェイト値を使用します。
ctrlを配置した箇所の一番近いVertexのウェイト値をwtAddMatrixのweight値として使用
することで、デフォームの動きに合った追従を再現することができます。
CompornentEditorを開き、該当するVertexのSmoothSkinのウェイト値を調べます。
顔のジオメトリは「Head」、「JawLaw」、「UpJaw」されており、
各ジョイントにウェイト値が設定されています。
これらのウェイト値を該当する③のWeightアトリビュートに設定します。
headのウェイト値を、ctrl_defのWeightアトリビュートに入力します。
lowJawのウェイト値を、ctrl_lowJawのWeightアトリビュートに入力します。
upJawのウェイト値を、ctrl_upJawのWeightアトリビュートに入力します。
⑧ 挙動を確認してみます。
ctrlがデフォームの動きに追従しています。
今回は説明のために、コントローラーに直接接続していますが、
コントローラーのアトリビュートは解放しておく必要があるので、
実際はコントローラーの親にSpaceノードを作成してSpaceノードに設定するのが良いです。
まとめ
今回はフェイシャルのリグを例にaddMatrixとwtAddMatrixをご紹介しましたが、
他にも色んな用途で活用できます。
ローカル化する場合はMatrixの接続が少し面倒ですが、
接続を工夫すると、更に別パラメーターでの制御も可能なので自由度は高いと思います。
また、Planeに依存せず挙動も安定しているため、他のキャラへのリグの移植や流用に効果的です。
ぜひ試してみてください。
ではまた!
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。