VRM4UとVMCを使ってモーションキャプチャー


なるべく簡単にモーションキャプチャーでVroidのキャラをモーションキャプチャーする方法を紹介したいと思います。

とはいえ、OBSでエディタの一部を映す不完全な方法なのでとにかくUnreal Engineで簡単に試したいという人向けです。
一応数少ない売りとしては商用で使いたいけどUnityのエディタにお金払いたくないって人向けでもあります。

まずステージがないと寂しいのでUnreal Engine5.21のDMXTemplateでプロジェクトを作ります。
DMXTemplateのFixturesというマップを開きます。

ステージのマップ

この組み合わせだとなぜかとても軽いので10年くらい前の最新PCくらいでWindows11にできないレベルのPCでもなんとか動作します。

まずOSCのプラグインが無いとVMCでモーションキャプチャしてくれないのでプラグインを追加エディタを再起動します
(OSCのプラグインインストール後のエディタ再起動の直前にVRM4UのPluginsフォルダをコピーするのが手間が少なくて良いです。)

OSCプラグインを追加しエディタを再起動します

VRM4Uの最新バージョンをインストールします。
この記事は「VRM4U_5_2_20230716.zip」のプラグインを使用しています。
2023年の3月以降の近いバージョンでないとvmcのテストマップなどが無かったりコントロールの名称が違ったりして動作しない可能性があります。

VRM4Uのプラグインを有効にしてエディタを再起動します。

VRM4Uのプラグインを有効にしてエディタを再起動します。

適当なフォルダを作成し、VRMのモデルデータをインポートします。
ライトの影響を受けたいのでMaterial TypeでSubsurfaceProfileを選択してインポートします。

ライトの影響を受けたいのでMaterial TypeでSubsurfaceProfileを選択してインポート

PluginsフォルダのVRMコンテンツをvmcで検索し、BP_VMCReceiverをレベルにドラッグします。

EUB_VMCTickもレベルにドラッグします。
(※前回この手順が抜けてました。すみません。)

次にBP_VMCCharacterをレベルにドラッグします。

BP_VMCCharacterを開いてスケルタルメッシュを動かしたいVRMモデルのスケルタルメッシュにしコンパイルし保存します。
(1体しかモーションを受け付けないとかプラグインのバージョンアップをしない前提の割り切った改造です。)


モーションキャプチャーしたいモデルに差し替える


次にVMCプロトコルを出せるアプリを起動してVMCを送るIPアドレスを調べます。
例に出しているのはVRM Posing DESKTOPです。
(同じUE5もこのVMCを送信するアプリも同じPCで起動する場合は127.0.0.1というアドレスが使えます。ポート番号は任意です。)

VMCを送るIPとポート番号を調べる

VMC出せるアプリでおすすめなのはiPhoneSEの第2世代でも使えるTDPTです。
600円課金しないといけないですが、モーションの解析処理をiphone側で肩代わりしてくれるためPCの負荷をだいぶ軽くすることができます。
PCと同じネットワークのWiFiに繋いで使います。
この場合は127.0.0.1のアドレスが使えないのでUE5を動かしているPCのIPv4のアドレスを調べる必要があります。
Windowsの場合はcmdコマンドでipfonfig /all と入れWifiが繋がているネットワークのイーサネットアダプターのIPv4アドレスが設定するアドレスです。

後の工程のためVMCを出せるアプリからプロトコルを送信しておきます。

調べたIPをBP_VMCReceiverに設定します。
設定終了後にデフォルトの項目にある「Server Listen」ボタンを押します

IPとポートを設定後 Server Listenボタンを押す。

レベルに配置したVRMモデルがアプリで設定したポーズに変わります。

プロジェクトを実行します。(スタンドアロンゲーム以外)

OBS Studioなどのキャプチャーソフトを使ってエディタの一部を録画します。

あとは音楽入れるなりDMXのデータにこるなりすればそれなりのものになると思います。

これだけだと、使いづらいのでまばたきする自動で機能を追加します。
※本来はフェィシャルキャプチャーとか使ったほうが良いのでしょうが、
iphone2台使いとか全然簡単じゃないので。

まずモデルのスケルタルメッシュを開いてモーフターゲットを表示します。
VRMをインポートしたフォルダでSK_で検索したものを開きます。
その中から両方の目を閉じるモーフターゲットを探し、名前をコピーしておきます。

モーフターゲット名をマウス右クリックでコピー


BP_VMCCharacterを開きます。
※注 このやり方だと今回の仕組みでモーションキャプチャする全部のモデルに実装されてしまいます。

イベントグラフのBiginPlayに0.2秒で0→1→0になるタイムラインを作成してつなぎます。

タイムラインを追加

作ったタイムラインをダブルクリックで開きトラックを押して「フロートトラック」を追加を押します。長さを0.2にした上でSHIFTキーを押しながら
下の図のようになるように画面をクリックします。
コンパイルし保存し閉じます、

まばたき用のタイムラインを作成する

スケルタルメッシュをイベントグラフにドラッグしSet Morph Targetノードを出し、さきほどコピーしたモーフターゲット名Morph Target Nameに入れタイムラインのUpdateを実行、タイムラインの値をValueにつなぎます。
また、まばたき終了後にランダムな時間で待機して再度まばたきするようにdelayを以下のようにつなぎます

自動的にまばたきをする仕組み

これで、自動的に瞬きするようになりました。

今のままでは距離が遠いのでカメラを設置するかPlayerStartを近づけてください。デフォルトのままだと暗すぎるのでポイントライトも設置したほうがいいかもしれません。

照明をいじりたい場合や手動でDMXを動かしたい場合はDMXTemplate/Sequenceフォルダにある、LS_FixtureDemoを修正するかレベル上にあるLS_FixtureSequenceの自動プレイのチェックを外して自前でレベルシーケンスを作るか、DMXコンソールコントロールを設定していじってください。
DMXコンソールコントロールの使い方はよかったらこの記事も参考にしてください。

いいなと思ったら応援しよう!