[Unity] モーションを記録して再生するまで
この記事ではVirtualMotionCapture経由でモーションキャプチャーしている方向けに、そのモーションの記録と再生の手順を紹介しています。
Unityの操作が不慣れな方でも作業できるよう細かく書いていますので少々くどいかもしれませんがお付き合いいただければ幸いです。
こんなの作れた
セルフコラボ(寂
今回はここまで作るよ
Unityの再生ボタンで自身のモーションと表情を再生できるようになります。
用意するもの
①VirtualMotionCapture (先行リリース版/以下ばもきゃと表記)
②Unity2018.4.18f1
③EasyMotionRecorder v1.1.6
下記URLの [EasyMotionRecorder.unitypackage]
https://github.com/neon-izm/EasyMotionRecorder/releases/tag/v1.1.6
④EasyVirtualMotionCaptureForUnity v3_7
下記URL右側のReleases[ExternalReceiverPack_v3_7.unitypackage]
https://github.com/gpsnmeajp/EasyVirtualMotionCaptureForUnity/
⑤アバター(VRMファイル)
大まかな手順
#1 モーション記録環境を作る
#2 モデルを動かす
#3 モデルの動きを記録する
#4 記録したモーションを加工する
#1 モーション記録環境を作る
Unityでプロジェクトを新規作成します。
まっさらなプロジェクトが作成されました。
ダウンロードしておいたEasyMotionRecorder.unitypackage ファイルを実行します。先ほどのプロジェクトにダイアログが表示されるのでImportボタンを押します。
取り込みが終わるとAssetsフォルダにEasyMotionRecorderフォルダが作成されます。左下のアイコンが赤い場合はUnityまたはEasyMotionRecorderのバージョンが合っていないので確認してみましょう。
続いてExternalReceiverPack_v3_7.unitypackage ファイルを実行します。
同様にImportボタンを押します。
チュートリアルが表示されたらOK!ダイアログは❌で閉じちゃいます。
VRMファイルを入れるフォルダを作りましょう。
Assetsで右クリック>Create>Folder でフォルダを追加します。
フォルダ名は何でも大丈夫です。ここではModelsとしました。
作成したフォルダの中にVRMをドラッグ&ドロップします。
モデルのアイコンが表示されているprefabファイルをHierarchyにドラッグ&表示されました。中央Gameタブにモデルが表示されました。あとで撮影するときに見えにくいのでカメラのTransformを調整して中央に大きく見えるようにします。
#2 モデルを動かす
ばもきゃからのモーションを受け取るためのレシーバーをセットします。Assetsの中にあるExternalReceiver.prefabをHierarchyにドラッグ&ドロップします。
InspectorのModelに動かしたいモデルを設定します。
念のためばもきゃの設定です。
・OSCでモーション送信を有効にするにチェックが入っていること
・PortがExternalReceiverのU Osc SeverのPortと一致していること
これでばもきゃからモーションを受け取れるようになりました。
再生ボタンを押してばもきゃでキャリブレーションしてみましょう。
動かない場合は設定を確認してみましょう。
動きが確認できたら再生ボタンをもう1度押して終了します。
#3 モデルの動きを記録する
モーションを記録するためのレコーダーを設置します。
Assets > EasyMotionRecorder > Prefabs > EasyMotionRecorder.prefab をHierarchyにドラッグ&ドロップします。
InspectorのMotion Data Player と Motion Data RecorderそれぞれのAnimatorにモデルを設定します。表情を記録するにはFace Animation Recorder のRecord Face Blendshape にチェックします。
これでモーション記録の準備ができました。
Unity上部の再生ボタン(▶)を押します。
Gameタブが選択されていることを確認してキーボードのRを押して記録を開始します。
Motion Data Recorder のRecording にチェックがつきます。(下図)
終わったらキーボードのXを押して記録を終了します(重要!)。
再生ボタンを押して停止すると記録が保存されないので注意!
Xキーを押すとしばらく保存処理が入ります。
記録が終わるとAssets > Resources にRecordMotion~.assetとFaceRecordMotion~.animが作成されます。
記録したモーションを確認してみましょう。
Motion Data Player の Recorded Motion Data に RecordMotion~.assetを設定します。
念のためExternalReceiverはチェックを外して無効化しておきます。
再生ボタンを押してGameタブが表示されていることを確認してキーボードのSを押します。モデルが動けばとりあえずモーション記録はOKです。
少々カクカクしたり、位置が異なっているかと思います。
これはアニメーション設定で修正できます。
また表情についても次章で合成していきます。
#4 記録したモーションを加工する
先ほど記録したRecordMotion~.assetを選択します。
Inspector内(画像の青枠あたり)を右クリックして「Export as Humanoid animation clips」を選択します。
しばらくするとRecordMotion~Humanoid.animというファイルが作成されます。作成されたファイルを選択するとInspectorが以下のように表示されます。
下におじさんが表示されていると思います。
再生ボタンを押してみるとおじさんが動きます。
これを見ながら調整します。
お急ぎの方は下記のようにしてみましょう。
ポイントはBased UponをOriginalにする点です。
[2021/09/03追記] Loop Poseにチェックするとループしたときにつなぎ目が無いようにアニメーション補完されますが開始と終了のポーズが違いすぎると不自然になります。
これでおじさんが滑らかに動くようになりました。
が、我々のモデルはまだカクカクですw
修正したアニメーションを適用していきましょう。
まずフォルダ内で右クリックしてCreate > Animator Controller を選択します。ファイル名は好きなもので大丈夫です(ここでは「ModelAnimation」としました)
作成したAnimatorControllerをダブルクリックします。
するとAnimatorというタブが表示されます。
Base Layer内で右クリックして Create State > Empty を選択します。
Entryから何か生えました。
New Stateを選択して、InspectorのMotionに先ほど作成したHumanoidファイルを設定します。
これでモーションの設定はOKです。
表情を付けたい方はもうひと手間。
Layersの+ボタンを押してレイヤーを増やします。(Face Layerとしました)
モーションと同様にNew Stateを追加して、InspectorのMotionにFace~.animを設定します。
Face Layerの歯車ボタンを押して、Weightを1にします。
これは本来複数の動きを合成するために使うようですが、今回はモーションと表情を別々に記録しているので単純に合成します。
これでモーションと表情の紐づけができました。
Hierarchyのモデルを選択してInspectorのAnimatorにAnimation Controllerを設定します。
※モデルのInspectorに似たような項目(Animation)というのがあるので間違わないように注意!
再生ボタンを押してモデルの動きを確認します。
先ほど地面に埋もれていましたが中央に表示されていると思います。
表情も反映されていますね。
再生してみると気づくと思いますが、Rキーを押してからXキーを押すまでが記録されています。始めと終わりを切り取りたいのですが、どうもそういった機能がなさそう・・・。(ご存じの方いらっしゃいましたら教えてほしいです!)
私なりの解決法、アニメーション再生をもう一度記録するという荒業w
つまりアニメーションを再生中にRキーを押して、終了したいところでXキーを押します。再度Animation Controllerを設定すれば任意のモーションのみ繰り返し利用できますね。
手順長々と書いてしまいましたが慣れればすぐ作れますし、1回作ってしまえば何度も記録できると思うので1家に1シーン置いてみてはいかがでしょうか?
参考にした記事
【Unity】複数のアニメーションをLayerを使ってブレンドする
https://www.karvan1230.com/entry/2021/01/12/212534