はじめに
VRMとは、人型3Dアバター(3Dモデル)データを扱うためのファイルフォーマットです。
VRoidStudioとは、VRMモデルを簡単に制作するためのツールです。
HumanIKとは、Mayaに標準搭載されている人型リグです。
この形式に対応させることで、様々な便利機能が使用できるようになります。
(UnityのHumanoidの概念に近いかもしれません。)
この記事は、モーションキャプチャで収録したモーションを、MayaでVRoidキャラクターに転写(リターゲット)し、Unityで実行するまでの流れを説明します。
モデル準備
VRoidで制作
VRoidStudio(v1.14.0)を用いて、キャラモデルを制作します。
今回はサンプルをそのままお借りします。
Blenderで変換
このモデルをMayaにインポート...と言いたいところですが、私の知る限りMayaにはVRMImporterが存在しません。
そこで、Blenderを使用してVRMモデルをFBXに変換します。
まずモデルの拡張子を.vrmから.gltfに変更します。
Blender(3.3.0)でgltfモデルとして、読み込みます。
テクスチャ表示状態とし、シーンファイルを保存しておきましょう。
その後Armatureを選択し、FBXとしてエクスポートします。
同梱されているテクスチャも分離しておきます。
File → ExternalData → UnpackResources → Use file in current...を実行します。
シーンファイルと同階層にtextureフォルダが生成され、その中にテクスチャが出力されます。
Mayaに読み込み
出力したFBXを読み込みます。
何やら見づらい状態ですので修正します。
テクスチャが剥がれているので、マテリアルにセットします。
(マテリアルは新規で作成したほうが望ましいと思いますが、今回は時短で再利用します。)
描画順がおかしかったので レンダラ → Viewport2.0 → 透過度のアルゴリズム を 深度ピーリングにします。
HumanIK対応
キャラジョイントをHumanIKジョイントの定義にセットします。
...手動で定義するのが大変なので、スクリプト化しました。
よかったら使ってください。(マッピングが間違っていたら指摘いただけるとありがたいです。)
rig_name = "VRoid"
mel.eval('hikCreateCharacter("{0}")'.format(rig_name))
mel.eval('hikUpdateCharacterList()')
mel.eval(' hikSelectDefinitionTab()')
model_root = "|Armature|Root"
cmds.select(model_root)
joint_settings = [["J_Bip_C_Head", 15],
["J_Bip_C_Hips", 1],
["J_Bip_C_Neck", 20],
["J_Bip_C_Spine", 8],
["J_Bip_C_UpperChest", 23],
["J_Bip_L_Foot", 4],
["J_Bip_L_Hand", 11],
["J_Bip_L_Index1", 54],
["J_Bip_L_Index2", 55],
["J_Bip_L_Index3", 56],
["J_Bip_L_Little1", 66],
["J_Bip_L_Little2", 67],
["J_Bip_L_Little3", 68],
["J_Bip_L_LowerArm", 10],
["J_Bip_L_LowerLeg", 3],
["J_Bip_L_Middle1", 58],
["J_Bip_L_Middle2", 59],
["J_Bip_L_Middle3", 60],
["J_Bip_L_Ring1", 62],
["J_Bip_L_Ring2", 63],
["J_Bip_L_Ring3", 64],
["J_Bip_L_Shoulder", 18],
["J_Bip_L_Thumb1", 50],
["J_Bip_L_Thumb2", 51],
["J_Bip_L_Thumb3", 52],
["J_Bip_L_ToeBase", 16],
["J_Bip_L_UpperArm", 9],
["J_Bip_L_UpperLeg", 2],
["J_Bip_R_Foot", 7],
["J_Bip_R_Hand", 14],
["J_Bip_R_Index1", 78],
["J_Bip_R_Index2", 79],
["J_Bip_R_Index3", 80],
["J_Bip_R_Little1", 90],
["J_Bip_R_Little2", 91],
["J_Bip_R_Little3", 92],
["J_Bip_R_LowerArm", 13],
["J_Bip_R_LowerLeg", 6],
["J_Bip_R_Middle1", 82],
["J_Bip_R_Middle2", 83],
["J_Bip_R_Middle3", 84],
["J_Bip_R_Ring1", 86],
["J_Bip_R_Ring2", 87],
["J_Bip_R_Ring3", 88],
["J_Bip_R_Shoulder", 19],
["J_Bip_R_Thumb1", 74],
["J_Bip_R_Thumb2", 75],
["J_Bip_R_Thumb3", 76],
["J_Bip_R_ToeBase", 17],
["J_Bip_R_UpperArm", 12],
["J_Bip_R_UpperLeg", 5],
["Root", 0]]
for joint_setting in joint_settings:
mel_command = 'setCharacterObject("{0}","{1}", {2}, 0);'.format(
joint_setting[0], rig_name, joint_setting[1])
mel.eval(mel_command)
mel.eval("hikCreateControlRig;")
これでVroidモデルをHumanIKリグで動かすことができました。
モーキャプ転写
今回はRokokoMotionLibraryというプラグインから、モーションを購入して使用しました。
(0円サンプルお借りしただけですが)
Mayaのバージョンに制約があるので、2022.1を使用しました。
キャラとモーションをシーンにロードし、キャラクタにVRoid、ソースにモーションを設定します。
アニメーションを再生するとキャラにモーションが転写されます。
ダンスモーションとアクロバティックなモーションも問題なく転写できてますね!!
この記事ではアニメーション修正は行っていませんが、当然この後に手を入れることも可能です。
コンテンツならではの誇張表現などもここで入れてしまいしょう。
Unityで流す
UnityプロジェクトにUniVRMを導入します。
詳細は省きますが、VRMのバージョンが一致しないため、【Migrate to VRM 1】にチェック入れて、対応します。
モーションをHumanoidにしてImportし、問題なく流れることを確認できました。
まとめ
HumanIKを利用して、VRoidモデルにモーションをリターゲットしました。
VRMはアバター利用が主とはいえキャラを差し替えられるゲームも出てきているので、事前収録のモーションを流す需要も一定あると思います。
直接Unityでリターゲットとアニメーション修正する案もあるかと思いますが、MayaであればDCCツールらしい快適なサポートを標準で受けることができます。
特にダンスなどの長尺モーションや宙返りのようなアクロバットな動きの修正は、まだまだMayaのほうがやりやすいと思います。(主観です。)
VRMはUnityやBlenderでの活用事例は多く見られますが、Mayaの記事はあまり見られない印象です
さらにモデリング記事はあれど、アニメーションに関する記事も同様にあまり見られない印象です。
この記事が多様な制作方法の助けになれば幸いです。