Neuron ProでVRMモデルを動かしUnity上でViveコントローラーから表情を付けるワンオペVTuber

こんにちは、バーチャルYouTuberの[赤坂まさか](https://twitter.com/settings)です。

Unityで、Perception Neuron ProとHTC Viveを併用してリアルタイムにVRMモデルを動かす、という特殊？なことをやったので、覚書のつもりで書いておきます。

タイトルに「ほぼ」と書いたのはカメラのスイッチングが一人だとやや厳しいからです（どうしても操作してるのが画面越しでバレてしまう）。

**ちなみにわたしはコードは書けません。**(重要)

// ※実際にこのシステムを使った配信アーカイブはこちらです。
// https://www.youtube.com/watch?v=n4wQItbvkWs


# やりたかったこと

モーションキャプチャーでVRMモデルを動かす方法はいくらでもあるかと思います。
しかし今回はやや特殊な方法で実装することにしました。

- モーション→**Neuron Pro**からストリーミング（Viveのトラッキングが不満だったため、特に手首）
- 表情→**Viveコントローラー**でVRMのブレンドシェイプを操作する
- 手→今回はモデルが萌え袖なため手の表情付けは**行わない**（萌え袖おすすめ）
- リップシンク→**OVRLipSync**（母音の判定ができるので最高）
- カメラ→Cinemachineカメラを**CineSwitcher**でスイッチングする（神）
- 配信→**[Unity Capture](https://github.com/schellingb/UnityCapture)**の仮想カメラを使いOBSへ

ちなみに以前、NeuronPro+Hi5を使って[全14話のバンドアニメ「ばんぷろ なつフェス！」](https://www.youtube.com/playlist?list=PLuRAFrdwBtQlnh-hY4vpCNgjloVSI0H9q)を制作しました。そちらも合わせてご覧ください。
https://www.youtube.com/playlist?list=PLuRAFrdwBtQlnh-hY4vpCNgjloVSI0H9q

## モーション撮影

Neuron Proは、専用のキャプチャソフトからストリーミングさせることでUnityへモーションを流します。そしたらVRMに流します。

参考：**【Unity】Noitom Hi5とPerception Neuron PROを使った全身トラッキング環境の構築(+モーション記録)**
https://qiita.com/yusuke-ota/items/16618e7b40e6b91e4c7a

## 表情づけ

表情の操作はできる限り動きながらやりたい。そこで、Unity上でバーチャルキャストのようにViveコントローラーから表情を操作したかったのです。**しかしわたしはコードが書けない。**

そこで、[八ツ橋まろん](https://twitter.com/Maron_Vtuber)さんの**[VR Motion Recorder](https://www.pixiv.net/fanbox/creator/16717003/post/516193)**をお借りしました。これが最高です（使用にはFANBOXの支援が必要）。

今回はVR Motion Recorderの**「ハンドサインやリップシンク、表情変更、まばたきの設定」**機能だけを使用したかったため、読み込んだシーンから不要なオブジェクトを非アクティブにします（主にモーションキャプチャー関連）。

（本当はVR Motion Recorderの手持ちカメラ機能も使ってみたかったのですが、Neuron ProとSteam VRのプレイエリアを合わせるのが不可能だったため諦めました。）

表情は、下記URLのBlendShapeEditHelperを使いそれぞれの表情のブレンドシェイプをアニメーションクリップに変換した上でVRMにアタッチされたアニメーターのコントローラーのAnimationOverrideの中にそれぞれのアニメーションを指定してください。

参照：**[ブレンドシェイプをAnimationClipとして保存する | Unity](http://mebiustos.hatenablog.com/entry/2015/09/13/213539)**

ただ、そのままだと表情のブレンドシェイプがNeuronに上書きされてしまい表情の反映がされません。

- NeuronAnimatorをテキストエディタやメモ帳などで開き、56行目のvoid Update を void LateUpdateに変更する。

※手をコントローラで制御したい場合、以下も追加作業する

- NeuronAnimatorの90～123行目あたりを全てコメントアウト


以上で、表情がモーションと競合せずに正常に動作するようになります（八ツ橋まろんさんに教えていただきました、ありがとうございました）。

視線はVRM Look at HeadのTargetをメインのカメラに設定しました。

## 手

操作したい場合は、表情と同様にコントローラーから操作するのが良いかと思います。

Hi5グローブを使うと正確に指まで取れますが、磁気が狂いがちでなかなか難しいのと、表情のリアルタイム操作が犠牲になります。

## リップシンク

リップシンクはVR Motion Recorderのものを外して、代わりにOVRLipSyncのものを使用しました。

[VRMLipSyncContextMorphTarget](https://github.com/TsubokuLab/VRMLipSyncContextMorphTarget)は神。



## カメラ

**[Cine Switcher](https://booth.pm/ja/items/1654878)は神。**

ただ、シネスイッチャーが動かない問題に小一時間悩まされたのでいちおうメモ。**Cam ListのElementに指定するのはバーチャルカメラ本体じゃなくてその親のゲームオブジェクトだよ！**（ちゃんと[使い方動画](https://youtu.be/GURL1CDgAiw)見てなかったのがわるい）

PostProcessingを使うとリッチな映像になりますので、音楽ライブなどの用途にオススメです。

ちなみにCinemachineの自動追従は実際の配信でめちゃ狂いました。なぜ。

## 配信

参照：**[UnityのフルHD映像をOBSで受信する方法](http://kaiware007.hatenablog.jp/entry/2018/07/08/021815)**

ちなみにモニタリングはサブディスプレイにもOBSを立ち上げてOBSをキャプチャして左右反転表示させてやりました。たぶんHD画質のバーチャルカメラを再取得するより負荷は軽いかと。

# 既知の課題

- **いや、指取れないじゃん**→わかる。（VR Motion Recorderを使っても指と表情が同時に変わってしまいます。Viveのコントローラー、圧倒的ボタン不足）
- **いや、早く動くとモーション狂うじゃん**→わかる。（ちょっと踊ったりスクワットしたり（？）するだけでめちゃくちゃグネります。磁気の影響なので、磁気が安定してくると戻っていくのでキャリブレーションとかの問題じゃない…。楽器演奏のキャプチャーもほぼ不可能です。新しく出る[Perception Neuron Studio](https://www.aiuto-jp.co.jp/products/product_2939.php)ってやつだと改善されているのかもしれない…。）
- **Cinemachineのカメラ追従使いたい**→わかる。（Aimをモデルに設定して適切なモードに設定してもなぜかすごいZ角度がひん曲がります）