RBFを用いたMuscle表現手法

2020/09/24

こんにちは、BACKBONEの中川です。

今回はRBF(Radial Basis Function)を用いた補助骨の制御方法をご紹介します。

本記事では、MITライセンスで公開されているフリープラグインの『weightDriver』を使用し、
ドリブンキーでの制御と比較しながら、RBFソルバーの有用性についてご紹介したいと思います。
※RBFについての詳しい説明は割愛します。

 


1.ドリブンキーの設定

例として、上腕二頭筋を表現するための補助骨を作成し、
肘の回転をドライバーとしてドリブンキーで動かすケースを考えます。

 

まずは上腕二頭筋を表現するための補助骨を作成し、ウェイトを調整しました。
※以下、仕組みについてのご紹介のためデフォームのクォリティは詰めておりません。

 

の回転をドライバーとしてドリブンキーを設定し、
補助骨を肩側に移動させることで上腕二頭筋を表現しました。
※補助骨のドリブンキーの設定手法については、
Mayaパーフェクトスキニングウェビナーをご覧ください。

 

次に、肘を曲げた状態で手首をひねる挙動を考えます。
肘を曲げて力こぶを突出させたまま手首を回外させると、
力こぶは肩側に、回内させると前腕側に動きます。

この動きを表現するために、
手首のひねり回転の値をドライバーとしてドリブンキーを追加しました。

 

これにて完成……と思いきや、これでは問題があります。
初期ポーズで手首をひねると、先ほど設定したドリブンキーは
手首のひねり回転の値をドライバーとして設定しているため、
補助骨が動いてしまいます。

肘を伸ばした状態では、手首のひねりに対して
上腕二頭筋がこのように大きく動くことはありません。
もう少し動きをおさえるか、動きを止める必要があります。

 

今回、表現したい挙動は、
①肘を曲げると補助骨は上下に動く。
かつ
②肘を曲げた状態で
手首を回外・回内(ひねり)させた時のみ、補助骨はさらに上下に動く
です。

①に関してはドリブンキーで設定できますが、
②に関しては「肘を曲げた状態で手首を回外・回内させた時のみ
という条件があるため、
ドリブンキーで表現することは困難です。

 

そこで、RBFソルバーの出番です。

 

RBFソルバーを使用すると、多次元の値を入力として設定できるため、
②のような条件があったとしても設定が可能です。
以上を踏まえて、
・目的とするポーズ
・各ポーズでの補助骨の挙動
をまとめると、下表になります。

次の項では、実際にweightDriverを使用して上表の挙動を設定してみます。

 


2.weightDriverの設定

weightDriverのプラグインをロードし、
スクリプトエディターのMELタブで
weightDriverEditRBF;
を入力してweightDriverのGUIを立ち上げます。
詳細はweightDriverの配布サイトの動画などをご覧ください。

 

今回、ドライバーとして必要なものは
・肘の回転値
・手首の回転値
となります。
の回転にはクォータニオンのYawを、
手首の回転値はRollを設定しておきます。
※クォータニオン値の設定方法については割愛します。

 

次に、GUIのDriverに肘の骨と手首の骨を登録しますが、
weightDriverのGUIでは、Driverに1つのノードしか登録できません。
つまり、肘の骨と手首の骨が登録できません。
そのため、『肘の骨のYaw』と『手首の骨のRoll』
の値を別の1つのノードにまとめる必要があります。

 

空のノード(名前:armMuscle_driver_L)を作成し、
lowArmYaw、wristRollという名前でアトリビュートを追加します。

 

肘のYawをlowArmYawに、
手首のRollをwristRollに接続します。
こうしておくことで、
肘と手首の骨の必要な回転値を
作成したノードを介してDrvierに登録することができます。

 

armMuscle_driver_LをDriverに登録します。
Attributesの項目に全てのアトリビュートが表示されるので、
右クリック→『Show Keyable Only』にチェックを入れて
キーアブルなアトリビュートのみを表示します。

 

上腕二頭筋の補助骨(armMuscle_jt_L)をDrivenに登録します。

 

次に、下表の各ポーズを登録していきます。

 

lowArmYawが0、wristRollが0の状態で、
DriverのAttributesからlowArmYawとwristRoll、
DrivenのAttributesからtranslateXYZ、rotateXYZ、scaleXYZ
を選択してAdd Poseをクリックします。

 

次に、
lowArmYawが90、wristRollが0、
lowArmYawが130、wristRollが0、
、、、と表の全てのポーズを作成します。

この時点で補助骨の位置を調整したい場合は、
該当するポーズで補助骨の位置を調整した後、
『Update』ボタンをクリックすると各値が更新されます。

 

Applyをクリックします。
weightDriverノードが作成されて各アトリビュートが接続されます。

 

Apply実行後は、GUIからUpdateボタンは消えます。
Undoを実行してもUpdateボタンは戻ってきません。。。
また補助骨のアトリビュートはロックされて、
ビュー上での制御はできなくなります。

Apply実行後に補助骨を調整したい場合は、
GUIで数値入力で調整する必要があります。
数値入力後は、Applyをクリックすると全ての値が更新されます。

 

上記設定により、目的の挙動を実現できました。

 


3.Connect の設定

次に、GUIの『Connect』について説明します。

前項の手順では、GUIで全てのポーズを作成する際に
補助骨の位置を調整してからApplyを実行しましたが、
Apply実行後は数字入力での調整になるため、
調整や修正が非常に困難です。

『Connect』機能を使用すると、
ビュー上で視覚的に調整することができます。

 

上腕二頭筋の補助骨と同じ階層、同じ軸各ポーズの数の骨を作成します。
補助骨を複製して、名前をarmMuscle_pose0(~6)_Lに変更します。

 

作成した骨に、
armM
uscle_driver_Lで設定したアトリビュートと同様
lowArmYaw、wristRollアトリビュートを追加し、
各ポーズの値を設定します。
必ずDriverに設定したノードと同じ名前で設定してください
※下図はpose1(肘の回転:90、手首のひねり:0)

 

前項と同様に、GUIで全てのポーズを作成してApplyを実行します。
この時点で補助骨を調整する必要はありません。

補助骨は初期値(TranslateXYZ:0、RotateXYZ:0、ScaleXYZ:1)のままで作成します。

 

先ほど作成したarmMuscle_pose0(~6)_Lを
0から順番に選択してConnectをクリックします。
※pose0~6に選択順にそれぞれ接続されます。

 

これで、ビュー上で補助骨を視覚的に制御できるようになりました。
各ポーズでarmMuscle_pose0(~6)_Lを制御して挙動を確認します。

armMuscle_pose1_Lを制御すると、
pose1(肘の回転:90、手首のひねり:0)の条件下のみで
補助骨に影響を与えていることがわかります。

armMuscle_pose2_Lを制御すると、
pose2(肘の回転:130、手首のひねり:0)の条件下のみで
補助骨に影響を与えていることがわかります。

 

各ポーズで補助骨の挙動を調整して完成です。

 


4.まとめ

今回は、補助骨を制御する手法として、
主にweightDriverノードを用いたRBFの設定方法をご紹介しました。
RBFでは、指定したポーズで直感的にモデリング感覚で調整ができます。
肩と腕を上げるといった複雑なポーズでも設定可能なので、
ドリブンキーでの設定が難しい箇所で使用するのが良いと思います。
フェイシャルリグでも使用すると色々と便利ですね。

今回はweightDriverを使用しましたが、
RBFをエクスプレッションで作成しておけば
ゲームエンジンで実装する際に重宝されると思います。
処理負荷は考慮して、使用する箇所を限定する必要はありますが。。。

ぜひ試してみてください。
ではまた!

 

※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。