モーションキャプチャデータをBlenderでリターゲットするメモ

# 更新履歴
2022.04.21  初稿

# 概要
モーションキャプチャのアニメーションデータを、Blender上で特定のキャラクターにリターゲットする方法を記載します。
Optitrackで撮影したデータを例に解説していますが、基本的にどのアニメーションデータでも同じ手順で対応可能です。

# 大まかな流れ
1. アニメーションデータを用意する
1. アニメーションデータをBlenderにインポートする
1. リターゲット先のモデルデータをBlenderにインポートする
1. アニメーションデータをリターゲット先のモデルデータにリターゲットする
1. データを修正する
1. データを加工する

# 使用したバージョン
**Blender 3.1.2**

# 有料アドオン
本記事で紹介する手順では、2つの有料アドオンを使用します。

# 手順
## 1. アニメーションデータを用意する
Optitrackからアニメーションデータをエクスポートします。
ファイルの拡張子は`.bvh`か`.fbx`になるかと思います。
ただし`.fbx`の場合、BlenderはFBXのインポート/エクスポートが弱いため、有料のアドオンを使用することになります(後述)。

## 2. アニメーションデータをBlenderにインポートする
`.bvh`と`.fbx`で手順が変わるためそれぞれ記載します。

### 2.1. BVHファイルの場合
Blender標準のインポート機能を使用します。
1. Blenderの上部メニューから、`[ファイル] > [インポート] > [Motion Capture (.bvh)]`を選択します。
1. 用意したアニメーションデータ`(.bvh)`を選択してインポートします。
インポート時のオプションは必要に応じて設定してください。
基本的にデフォルトで問題ないですが、Optitrack側のフレームレート設定とBlender側のフレームレート設定が異なる時などにここで設定します。
1. アニメーションが正しく表示されれば完了です。

### 2.2. FBXファイルの場合
Blender標準のインポートでは読み込んだ後のボーン構造の都合が悪いので、有料アドオンを使用します。
予めこちらのアドオンをBlenderにインストールしておいてください。

https://blendermarket.com/products/better-fbx-importer--exporter

1. Blenderの上部メニューから、`[ファイル] > [インポート] > [Better FBX Importer (.fbx/.dae/.obj/.dxf.3ds)]`を選択します。
1. 用意したアニメーションデータ`(.fbx)`を選択してインポートします。
インポート時のオプションは必要に応じて設定してください。
1. アニメーションが正しく表示されれば完了です。

![003.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/9d0201e0-379b-b460-61fa-6c070b9d2613.gif)

## 3. リターゲット先のモデルデータをBlenderにインポートする
ここではいくつかの例を紹介します。

### 3.1 VRoid等のVRM形式のモデルデータの場合
VRMファイル`(.vrm)`を使用します。
VRoid Studioからエクスポートしたデータや、VRoidHubからダウンロードしたデータ、Boothなどで購入したデータが挙げられます。

VRMファイルをBlenderにインポートするには、**VRM_Addon_for_Blender**という無料のアドオンを使用します。
予めこちらのアドオンをGitHubから取得し、Blenderにインストールしておいてください。

https://github.com/saturday06/VRM_Addon_for_Blender

1. Blenderの上部メニューから、`[ファイル] > [インポート] > [VRM (.vrm)]`を選択します。
1. 用意したモデルデータ`(.vrm)`を選択してインポートします。
1. モデルが正しく表示されれば完了です。
![rt_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/61ce6de1-ff19-c552-2cdf-78b7bffcf024.png)

### 3.2 FBX形式のモデルデータの場合
FBXファイル`(.vrm)`の場合、前述のFBXアニメーションデータをインポートする項目でも記述しましたが、
Blender標準のFBXインポート機能が貧弱なため、有料アドオンを使用します。

https://blendermarket.com/products/better-fbx-importer--exporter

1. Blenderの上部メニューから、`[ファイル] > [インポート] > [Better FBX Importer (.fbx/.dae/.obj/.dxf.3ds)]`を選択します。
1. 用意したモデルデータ`(.fbx)`を選択してインポートします。
1. モデルが正しく表示されれば完了です。

### 3.3 UE4マネキンデータの場合
UE4のマネキンデータは、UE4EditorからマネキンをFBX出力してからBlenderにインポートする方法と、Blender向けに公開されているアドオンを利用する方法があります。
ここでは**Mr Mannequins Tools**という無料アドオンを利用する方法を紹介します。
予めこちらのアドオンをダウンロードしてBlenderにインストールしておいてください。

https://jimkroovy.gumroad.com/l/MrMannequinsTools

1. オブジェクトモードの状態で、`[追加] > [Mr Mannequins Templetes]`を選択します。
1. オプションが表示されるので、下図の赤枠の`[Use Rigging]`アイコンをオフに設定して`[OK]`を選択します。
![rt_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/372fe794-64e0-b7be-1ef7-a5f175f948d7.png)
1. マネキンがインポートされれば完了です。
![rt_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/2615b91b-6ee0-0391-accd-ef41d0c79a07.png)

## 4. アニメーションデータをリターゲット先のモデルデータにリターゲットする
この時点で、リターゲット元のアニメーションデータと、リターゲット先のモデルデータが同じBlender上の存在していることを確認してください。
今回、リターゲットには有料アドオンの`Auto-Rig Pro`を使用します。有料ですが機能が充実していてネット上に情報も多いのでオススメです。
予めこちらのアドオンをダウンロードしてBlenderにインストールしておいてください。

https://www.blendermarket.com/products/auto-rig-pro

![rt_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/7f29ed89-e14d-2b56-7e28-71adff29b61f.png)
1. ビューポート右側のサイドバーから、`[ARP]`を選択してAuto-Rig Proを開きます。
1. `[Auto-Rig Pro]`というセクションが開いているので閉じます。
1. `[Auto-Rig Pro: Remap]`というセクションを開きます。

ここからはオブジェクトモードで作業します。

![rt_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/d51f0918-5117-83a2-9ade-ee637c39bf69.png)
1. コピー元のアーマチュアを選択した状態で`[Source Armature]`のスポイトアイコンをクリックして、アーマチュアを選択します。
1. コピー先のアーマチュアを選択した状態で`[Target Armature]`のスポイトアイコンをクリックして、アーマチュアを選択します。
1. `[Auto Scale]`を選択してリグのスケールを自動で調整します。
1. もし、モーションキャプチャーで撮影したアニメーションを**その場から動かないアニメーション**に変更したい場合は、`[In Place]`にチェックをいれます。

![rt_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/bf44e76e-e8b0-cc27-0e46-c4dcd13bd9a4.png)
1. `[Build Bones List]`を選択します。
1. ボーンリストが表示されます。`[Target Bones]`側はNoneと表示されますので、対応するボーンを一つずつ選択していきます。
1. ボーンリストのうち、ルートとなる`Hips`のボーンを選択した状態で、`[Set as Root]`にチェックを入れます。
(上図では`Skeleton_Hips`が該当します)

![rt_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/42d94084-d7f6-bc9d-c0b1-0f4fb4d240cf.png)
ボーンリストの対応が完了したら、設定ファイルをエクスポートしておくことをオススメします。
そうすることで、次回から`[Build Bones List]`の後にインポートすると紐付け作業が省略できます。

![rt_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/b6e3ee4e-f147-7635-b923-dfba48b7a209.png)
![rt_012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/d94c887b-f729-c4bd-957d-a84dfa385dbd.png)
1.  `[Re-Target]`をクリックしてリターゲットを実行します。
1.  オプションはひとまずそのままで良いかと思います。!
1. アニメーションが正しくコピーされれば完了です。
![Blender 2022-04-22 12-20-06_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/1fe76566-1d2b-d6f2-c1c6-ff8d0a89dbc6.gif)

## 5. データを修正する
リターゲットは完了したものの、コピーしたアニメーションには問題があります。
モーションキャプチャーのソフトウェアから出力したアニメーションデータは大抵の場合、`Root`ボーンが存在せず、`Hips`のボーンから始まります。
しかしキャラクターモデルは大抵の場合、`Root`ボーンがあるデータが多いです。
`Root`ボーンが無いデータを`Root`ボーンがあるデータにリターゲットすると、`Hips`の移動が`Root`ボーンに打ち消されてしまい、腰が動かないモーションになってしまいます。
![001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/969166dd-9997-eb56-3489-b2c246b42e83.gif)
上図では膝を曲げた際にVRoidのキャラクターの腰が下がっていないことがわかります。

この症状を改善するため、ボーンコンストレイントの機能を使って、リターゲット元の`Hips`の動きをリターゲット先の`Root`に適用します。
1. ポーズモードに変更します。
1. リターゲット先の`Root`ボーンを選択します。
1. `[ボーンコンストレイントプロパティ] > [ボーンコンストレイントを追加] > [チャイルド]`を選択します。
1. `[ターゲット]`にコピー元のアーマチュアを選択し、`ボーン`にHipsを選択します。
1. `[回転]`と`[スケール]`のXYZを外し、`[移動]`だけ有効にします。
1. `[逆補正を設定]`を選択します。
下図のようになっていればOKです。
![rt_013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/37a76355-e807-4d19-c550-3ed54956eafe.png)

これでリターゲット先の`Root`ボーンにリターゲット元の`Hips`ボーンの移動アニメーションが適用され、アニメーションが正しく再生されます。

![002.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/35030e06-2c9b-0a7a-f899-6b07526bb2a7.gif)

この状態でも問題ないのですが、コンストレイント設定が残り続けるのが嫌な場合、`Root`ボーンにベイクすることもできます。
ベイクすることで、コンストレイントによって動かしていた移動値を`Root`ボーンに直接アニメーションキーとして焼き付け、コンストレイントを外してもアニメーションが残るようにできます。
1. ポーズモードに変更します。
1. リターゲット先の`Root`ボーンを選択します。
1. ビューポート左上の`[ポーズ] > [アニメーション] > [アクションをベイク]`を選択します。
1. オプションを下図のように設定して`[OK]`を選択します。
![rt_014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/74e4a2cb-bb83-dc59-bbc8-6bfa1519c8fb.png)
1. アウトライナー上で`Root`ボーンに適用されていたコンストレイントが消え、先程同様にアニメーションしていれば完了です。

## 6. データを加工する
### キーフレームを削減する
モーションキャプチャーで収録したアニメーションデータは、すべてのフレームにキーが打ってあります。
精度の低いキャプチャシステムの場合、毎フレーム僅かに座標がずれて記録され、常に震えているようなモーションになってしまうこともあります。
![rt_015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/c96dbdb5-2a39-7cc1-df54-801254cddde5.jpeg)

これを改善するために、キーフレームの削減(リダクション)を行います。

1. `Simplify Curves+`というアドオンを有効にします。
![rt_016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/456769fa-6839-3914-af20-04341545ca5a.jpeg)
1. `[グラフエディター]`ウィンドウを表示します。
1. ポーズモードにして、ボーンをすべて選択状態にすると、グラフエディターにキーフレームが表示されます。
![rt_019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/7dbf891d-c10d-3584-4aa9-7b532895e637.png)
見づらい場合はグラフエディター上で`[A]キー`を押すと画面内にすべてのキーが表示されるようにスケールされます。
1. 削減したいキーの範囲をマウスで囲います。
1. グラフエディターウィンドウのメニューから、`[キー] > [キーフレームを掃除]`を選択します。
1. グラフエディター内にオプションが表示されるため、`[しきい値]`という数値を調整することで、キーフレームを削減する強度を変更することができます。
![rt_020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/b7306a5d-3e27-7699-f912-0242859ac95c.png)
キーフレームの削減は、やり過ぎると動きにメリハリが無くなってしまうためどこまで突き詰めれば完了とするかはさじ加減になります。
![rt_018.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53109/f58b6edf-6f61-9234-d15d-737fc30a9d1e.jpeg)