はじめに
キャプチャデバイスからリアルタイムにUnity上のVRMにトラッキングモーションを反映させてAnimationClipに出力することができるらしい。
WEB検索すればかなり以前よりやり方を見つけることができる。作りたいゲームで使えそうなので動作確認したときのメモ。
実践
1・VROIDなどでモデルをVRM1.0で書き出す。
2・キャプチャデバイスの代わりにVMCプロトコル送受信できるVrmPosingDesktop(有料)でモデルを読み込ませておく。
3・UnityでEasyVirtualMotionCaptureForUnityとEasyMotionRecorderのパッケージを読み込ませておく。
4・Unityで先程のVRMモデルを展開しておく。

5・ExternalReceiverにアサインして、VrmPosingDesktopからのキャプチャが受信できていることを確認(↑)。
6・EasyMotionRecorderの使い方は割愛するが、キャプチャを録画するときにGame側画面のモデルを選択してからショートカットで録画開始などしないと動かないので、しばらく迷った(メモ)。
7・記録されたモーションは、右クリップでAnimationClipに出力できるのでAnimationControllerやUnityTimelineで扱うことができる(メモ)。
8・キャラクターが沈んでしまう場合はAnimationClipにあるRoot Transform Position(Y)をBased Upon:Originalに変更(メモ)。

AnimationClipをTimelineにドラッグしてアニメーションを再現できた。便利。
なんか目の追従がおかしい・・・再生時にExternalReceiverを非アクティブにしたら直った。正確にはExternalReceiverの目のボーンを同期しないにチェック入れれば解決(メモ)。
おわりに
これでUnityでVrmを使ったちょっとしたアニメーション制作やゲームモーション付けが楽になりそう。
TDPTを使えばカメラでキャプチャとリアルタイムや動画からキャプチャ反映ができるようなので、次回はこれも試していきたい。
EasyVirtualMotionCaptureForUnity導入時はUniVRM入れると、アセンブリなど重複やUniGLTFが参照できなかったりするので、EasyVirtualMotionCaptureForUnityのみのキャプチャ専用のプロジェクトとしてAnimationClipを量産や編集に使うとよいと思います(メモ)。
まえもどこかで書いたかもだけど、VRMがカメラの特定の範囲から外れるとBlendShapeなどのモデルが非表示になる場合がある。その場合対象のオブジェクト(Faceなど)のUpdate When Offscreenのチェックをオンにすれば消えることはない。逆にずっと描画しているのでカメラ外でも描画コストにつながるので、スクリプトでカメラ外(完全に見えない状態)に出たらオフにするなど管理をすればよいのかな?







