8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UnityAdvent Calendar 2022

Day 4

VRM(VRoid)モデルをMayaのHumanIKに対応し、モーキャプしたモーションを流す

Last updated at Posted at 2022-12-03

はじめに

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のタブを出して

キャラクタ定義を作成して

キャラジョイントを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の記事はあまり見られない印象です
さらにモデリング記事はあれど、アニメーションに関する記事も同様にあまり見られない印象です。
この記事が多様な制作方法の助けになれば幸いです。

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?