ReboCapとUnityでモーションキャプチャー＆モーション録画をしたい！

# RebocapとUnity間でモーションデータを送れるようにする
安価なモーキャプを使ってオリジナルのモーションデータの録画がしたいけど、調べても全然情報が出てこない！！ということで、作成したモーキャプ環境（システム面）の備忘録を書いておきます。誰かの参考になったら嬉しいです。

以下の画像の様に、Rebocapでモーションキャプチャ→VMCプロトコル→Unityにてモーション録画するシステムを目指します。

![スクリーンショット 2024-10-07 173411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/fa8554c6-9014-0721-83c7-ce85b515d7a5.png)







ちなみに今回録画したモーションデータを利用して、YouTubeで小夜/SAYOというキャラクターのライブを行いました．こんな感じのモーションが記録できるんだな～というサンプルとしてご覧いただければ幸いです。

https://youtu.be/Y0xhykWA59k?t=636

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/21752535-bf19-d66a-e281-7555d0c7f07e.png)


## はじめに
今回は
- 値段が安いことと（購入時点で2.5万円ほど）
- トラッキングできる点が多いこと（15点トラッキング）
- PC（+トラッカー）のみでモーキャプが完結できること

からRebocapを採用しました。

対抗馬としてソニーさんのmocopiが上がっていましたが、検討時点ではモーキャプをするのにスマホが必須だったのでRebocapに軍配が上がりました。

## セットアップ
公式様の使い方ページを参考にセットアップを進めます。
[使い方 / How to use](https://gpsnmeajp.github.io/EasyVirtualMotionCaptureForUnity-documents/HowToUse/Japanese/)

Rebocapのセットアップについては別途終わらせているものとします！
今回はRebocapの初回セットアップ方法やキャリブレーション方法については触れません。

## プロジェクト作成
まずはUnityのプロジェクトを作成します。
Unityのバージョンは[EVMC4Uの公式ページ](https://gpsnmeajp.github.io/EasyVirtualMotionCaptureForUnity-documents/)を参照してください。

::: note info
現在(2024/08)はUnity2019.4.29f1 (v3.8~)以上対応
:::


パイプラインはビルトイン（標準）のものを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/94e8ad19-81fc-16ef-a4fa-df3a97120ece.png)


## EVMC4Uのインポート
続いてモーションデータを受け取るためのUnitypackageをダウンロードします。
[EVMC4U - EasyVirtualMotionCaptureForUnity](https://booth.pm/ja/items/1801535)

バージョンが2種類ありますが、今回は安定版をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/849e3bc2-8678-5a5d-616c-3b64c15799f8.png)

ダウンロード・解凍したら、フォルダ内にある`ExternalReceiverPack_v4_1.unitypackage`をUnityのprojecタブにドラッグ＆ドロップして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/d03b20c8-f5bf-38b3-c89b-fda02573767d.png)


すべてにチェックが入っていることを確認してインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/67300ef9-d6bf-89c4-833a-0e54b0f4dd05.png)


インポートできたら、シーン`ExternalReceiver`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/32de4530-cb07-2afe-5bf0-0e63d6dca005.png)


## VRMのインポート
ご自身で用意した（動かしたい）VRMファイルを用意します。

:::note info
今回は[小夜/SAYO公式MMDモデル](https://booth.pm/ja/items/6035432)をVRM形式に変換したものをサンプル画像として使用していますが、各自使用したいVRMモデルを読み込んでください．
:::

:::note warn
VRMファイルの利用規約はしっかりと確認しましょう！！
:::

Projectの表層にVRMファイルをドラッグ&ドロップすると、色々なファイルが展開されて見づらくなってしまうので、あらかじめ新規ファイルを作成して、その中にドラッグ＆ドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/6aee28cf-968f-cb3c-7ee7-e6120c065d44.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/d970aa38-92a7-dc40-0b10-7c6ccf492e14.png)



VRMファイルを読み込めたら、Prehabをhierarchyタブにドラッグ＆ドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/fce3d9c4-6cab-04c4-f069-09306de76a15.png)


続いてExternalReceiverを選択し、先ほどhierarchyタブに置いたPrehabを`VRMモデルのGameObject`にアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/6b4f61da-31f4-feba-56a7-80d903c62e5a.png)


さらにモーションデータ受信の際に受け取った値を調整する設定もしておきます。

VRMモデルとリアルアバター（あなた）の体格が異なる場合、**ボーン位置の厳密な同期**をオフにすると自然なモーションを保ったままモデルが動いてくれるのでオススメです。その他の項目は目的に応じて調整してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/4f8c66ce-ff87-d64e-05c2-464c20997345.png)



## VMCProtocolを利用してモーションを受信する
RebocapとUnity間でVMCProtocolを利用してモーションデータを送信します。

まずはRebocap側で何番のポートにモーションデータを出力しているのかを確認します。

:::note info
もしポート番号を変えたい場合は、一旦VMC出力をオフにすると番号を変更することができるようになります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/710907c0-2895-c107-74f9-dbf79eec1cb5.png)


つぎにUnity側で、Rebocapで設定されているポート番号と同じ番号を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/c18fe399-7fb4-a638-52ed-ceb10b79a561.png)



## モーション受信テスト
これでUnityでRebocapからモーションデータを受け取るセットアップは完了です！
Rebocapでモーショントラッキングをスタートしてキャリブレーションを行ったあとに、UnityのPlayボタンを押してシーンを再生してみましょう！


# モーションデータを録画する

[EasyMotionRecorder](https://github.com/neon-izm/EasyMotionRecorder) を利用してモーションデータを記録できるようにします。

## EasyMotionRecorderの導入
EasyMotionRecorderの配布ページから、最新バージョンのUnitypackageをダウンロードします。
[EasyMotionRecorder - Releases](https://github.com/neon-izm/EasyMotionRecorder/releases)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/70217c0e-9f1a-cb7a-b318-40fe7fc923b2.png)



ダウンロードしてきたUnitypackageを、Projectタブにドラッグ＆ドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/16bc3348-63d1-758e-e4d0-8f66d84c2390.png)



すべての項目にチェックが入っていることを確認して、インポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/cdff8a39-7c07-cf18-6f16-ab4e04145c84.png)


インポートが完了したら、`Assets\EasyMotionRecorder\Prefabs`の中にある`EasyMotionRecorder` Prehabをhierarchyタブにドラッグ＆ドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/9127f679-7b4f-0b15-dcf9-a457207f266b.png)


hierarchyタブに配置した`EasyMotionRecorder` Prehabを選択して、`MotionDataPlayer`と`MotionDataRecorder`コンポーネントの`Animator`にそれぞれモデルの親オブジェクト（Animatorコンポーネントを持っているオブジェクト）をセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/d5d5558c-e395-1abb-a0f9-e9c51cfd751d.png)


## モーションデータの録画
これでモーション録画の準備は完了です！！

Unityで再生ボタンを押して、`MotionDataRecorder`コンポーネントの`RecoredStartKey`と`RecordStopKey`にセットされているキーを押すと録画が開始・停止されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418961/f7a521ab-ad62-795f-9371-05ef4d726a21.png)

# 完成！
お疲れ様でした！これでモーション録画システムの構築は完了です！

このままだとキャラクタの表情などは記録されていないので、目的に応じてアニメーションタブから表情付けを行ったりするとよりイイ感じのモーションデータになります。
アニメーションの編集には、ちょっとお高いですがUnity Assetstoreで販売されているVery Animationがおすすめです。

https://assetstore.unity.com/packages/tools/animation/very-animation-96826