VIVE Tracker で VMD 形式のモーションを収録する【VMC+EVMC4U+UnityVMDRecorder】
IKinema Orion の急逝から早4ヶ月。VIVE Tracker を用いたモーションキャプチャーで VMD 形式のモーションを収録する方法が未だ確立しておらず、困っている人がいたので調べてみました。
結論としましては、タイトルの通り以下の3つを組み合わせることで簡単に VMD の収録環境を作ることができました。世の中の強い方々に感謝🙏
・バーチャルモーションキャプチャー (VMC)
・EasyVirtualMotionCaptureForUnity (EVMC4U)
・UnityVMDRecorder
VMC と EVMC4U を使って Unity 上でモデルを動かし、その動きを UnityVMDRecorder で保存するという流れになります。以下解説です。
◆◆◆
更新履歴
2021年4月24日:KeyReductionLevelについて追記
2020年4月21日:使用させていただいている各種アプリケーションの更新に伴い、Unity2019.1以降の使用を前提とした内容に修正
2020年2月2日:タイトルを修正
まず用意するもの
・トラッキングに使う機材
・Unity (2019.1以降)
・動かしたいモデルのVRM*
ここまで用意ができている前提で話を進めます。
今回の解説ではニコニ立体ちゃんの MMD および VRM を使わせていただきました。
*配布されているモデルを使用する場合は各自規約を確認してください。
■ VMC のダウンロード
今回は外部のアプリケーションにモーション等のデータを送る機能(OSC送信機能)のあるVMCが必要です。しかし2020年4月21日現在、booth で無料配布されているものにはOSC送信機能が無く、FANBOX で先行配布されているものを入手するか、ソースコードから自分でビルドする必要があります。
オススメは FANBOX です。たった300円でビルドにかかる手間と時間を節約できるのでバーチャルモーションキャプチャーは無料。
■ EVMC4U のセットアップ
How to use の「ExternalReceiverPackを使う場合(かんたん)」に従ってください(丸投げ)。同項に解説動画へのリンクもあります。
また、Unity2019.3 を使用している場合は「Unity2019.3での不具合について」も参照し、「1. Asset Pipelineをv1にする方法(推奨)」に従ってください(「2. 古いUnityで変換する方法(代替)」では後述の UnityVMDRecorder において不都合があります。)
キャリブレーションを終えると、Unity 内のモデルも同期して動き出すはずです。(↓トラッカー持ってないマン)
動かない場合は、OSC モーション送信を有効にしているか、ポート番号が合っているか、ちゃんと再生ボタンを押しているか、などを確認してみてください。
■ UnityVMDRecorder の導入
GitHub のページ からソースコードをダウンロードします。
Branch が 2019 になっていることを確認し、Download ZIP からダウンロードしてください。
解凍しましたら、先程の EVMC4U までのセットアップが終わった Unity プロジェクトにて Assets -> Create -> Folder から「VMDRecorder」というフォルダを新規作成し、その中へ
・UnityHumanoidVMDRecorder.cs
・UnityVMDQuaternionExtentions.cs
の2つをドラッグ&ドロップしてください。
また、同じ場所で Assets -> Create -> C# Script から「VMDRecorderController.cs」というスクリプトを作成し、以下のコードを貼り付けてください。(メモ帳等で作ってドラッグ&ドロップでも可)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class VMDRecorderController : MonoBehaviour
{
public string ModelName = "testModel";
public string VMDFileName = "testVMD.vmd";
private string OutputDirectory = "";
private string OutputVMDPath = "";
private bool Recording = false;
void Start()
{
OutputDirectory = Application.dataPath + "/VMDRecorder/";
}
void Update()
{
if (!Recording && Input.GetKey(KeyCode.R))
{
Debug.Log("収録開始");
Recording = true;
StartRecording();
}
if (Recording && Input.GetKey(KeyCode.S))
{
OutputVMDPath = OutputDirectory + VMDFileName;
Debug.Log("収録終了 : " + OutputVMDPath);
SaveRecord();
Recording = false;
}
}
void StartRecording()
{
GetComponent<UnityHumanoidVMDRecorder>().StartRecording();
}
void SaveRecord()
{
GetComponent<UnityHumanoidVMDRecorder>().StopRecording();
GetComponent<UnityHumanoidVMDRecorder>().SaveVMD(ModelName, OutputVMDPath);
}
}
※サンプルコードを参考に、Rキーで収録開始、Sキーで収録終了&保存ができるようにしたものです。
対象のモデルに対し、
・UnityHumanoidVMDRecorder.cs
・VMDRecorderController.cs
の2つをアタッチしてください。
これで準備は完了です。モーションの保存先のファイル名は VMD File Name で指定します。ファイルが既に存在していると上書きしてしまうので注意してください(収録中でも変更できます)。
Unity Humanoid VMD Recorder の各パラメータについては こちらの動画 で解説されています。
2021年4月24日追記
Humanoid VMD Recorderの「Key Reduction Level」は、キーの書き込み頻度を減らしてVMDファイルの容量を減らすためのパラメータです。2019のブランチではデフォルトで3(3フレームに1回書き込み)になっているので、全てのフレームで書き込みたい場合は1に変更しておきましょう。
■ 収録
VMC が起動していることを確認し、シーンを再生します。Gameビューをクリックしてアクティブにした状態で、Rキーで収録開始、Sキーで収録終了&保存できます。コンソール画面にログが出るようになっているので適宜確認してください。
収録した様子↓
■ MMDへの適用
UnityVMDRecorder が2020年2月15日に更新され、Unity2019版ではVRMで収録したモーションでもAスタンスに合わせてくれるようになりました。そのため、以下の作業は行うことなくそのままAスタンスのMMDモデルに流し込むことができます。
最後に一つだけ問題があります。VRMはTスタンスですが、MMDはAスタンスが基本であるため、今回録ったモーションをMMDでAスタンスのモデルに流し込むと腕が内側にずれてしまいます。
↑これの逆ですね
これを解決するにはTスタンスのMMDモデルを用意すると良いです。
参考:【MMDモデルの動きをNeuronに対応】A字型のモデルをT字スタンスに変換させる方法
これで綺麗になりました!🙌
※VRM作成時の正規化でいろいろやってるっぽいので場合によってはもっと別の対処が必要かもしれません
◆◆◆
以上になります。筆者は Unity も MMD も初心者なので間違っているところもあるかもしれません。フルトラ環境も無ければ長時間の収録も試していません。問題の報告、質問、訂正、アドバイス等お待ちしております。
UnityVMDRecorder は表情モーフも保存できるようです。通しで別撮りできたりして便利そうな気がします。
ところでこの方法で収録したVMDは毎フレームがキーフレームなので修正とか大変そうですね。試してないですがこういうのもあるみたいです。
最後に
歌って踊るもちひよこを見てくれ(これは Orion)