2020/09/24
RBFを用いたMuscle表現手法
こんにちは、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に変更します。
作成した骨に、
armMuscle_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をエクスプレッションで作成しておけば、
ゲームエンジンで実装する際に重宝されると思います。
処理負荷は考慮して、使用する箇所を限定する必要はありますが。。。
ぜひ試してみてください。
ではまた!
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。