初代Perception Neuronを使って接地について遊んだメモ

中古価格も落ち着いた **初代Perception Neuron** を使って、VRMモデルを動かして遊んでみました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">初代Perception NeuronでVRM動かしてVMCProtocolでモーション送るアプリ、コード見直したり設定詰めたりして、とりあえず自分で使う分には良い感じになったと思う。ちょっと試すくらいの気持ちで今更買って遊んでたけど、普通に撮影に使っても良いかも <a href="https://t.co/SEuzlzGODt">pic.twitter.com/SEuzlzGODt</a></p>&mdash; 大福らな🧷ぱふぇらむ公式VTuber (@daifuk_lana) <a href="https://twitter.com/daifuk_lana/status/1731689635238088734?ref_src=twsrc%5Etfw">December 4, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# はじめに
本記事では、 **初代Perception Neuron** をモーション記録ではなくリアルタイムに動かし、接地感を改善するまでの私の試行錯誤をメモとして残します。

:::note warn
**Perception Neuron 3.0** であれば磁気耐性も向上しており、ジャンプや上下の移動の精度などモーショントラッキングの性能も向上していますので、これから購入する場合は3.0をお勧めします。
:::

新型と旧型のPerception Neuronの比較は以下が参考になります。
**[モーションキャプチャ交流会 - Day2](https://www.youtube.com/live/8-cbiZMvBPk?si=Wf8xPg852MgNfitZ)**

**Perception Neuron Studio** や **3.0** は **Axis Studio** という新しい専用ソフトウェアを使用します。
**初代Perception Neuron** や **Neuron Pro** 、 **2.0** は旧世代の **Axis Neuron** 、 **Axis Neuron Pro** というソフトウェアを使用しますので、ハードウェアの性能に差があるかもしれませんが、リンク先の動画であれば **Neuron Pro** と **3.0** の比較が参考になるかもしれません。

3.0は価格が高騰しており、販売当初はBody kitが *<INS>約35万円</INS>* でしたが、現在は *<INS>約50万円</INS>* ですので、性能とのトレードオフで旧型を中古で購入することもありかもしれません。
**[Perception Neuron 3 Body Kit　NTM-PN3/BODY-KIT](https://shop.tsukumo.co.jp/goods/4549325049173/)**
※指トラッキングまで可能なグローブ付きは *<INS>約100万円</INS>* です。

私はメルカリで **初代Perception Neuron（マグケース付き）** を *<INS>89,000円</INS>* で購入しました。
保証もなく修理も難しいかと思いますが、eBay等でセンサ単体購入なども可能です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">というわけで買ったのは初代PerceptionNeuronのセンサ単体。ブルガリアのペルニクからはるばる届いた。ガレージセールで売られてたのをeBayに出品してて、動作未確認品 <a href="https://t.co/6Jzp5Xa3IK">pic.twitter.com/6Jzp5Xa3IK</a></p>&mdash; 大福らな🧷ぱふぇらむ公式VTuber (@daifuk_lana) <a href="https://twitter.com/daifuk_lana/status/1728599003519193253?ref_src=twsrc%5Etfw">November 26, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 使用アプリケーション等
**[Unity](https://unity3d.com/jp/get-unity/download)**
Unity上で動かします。私はバージョン2021.3.25f1を使用しています。

**[Axis Neuron (PN32)](https://neuronmocap.com/pages/axis-studio)**
初代Perception Neuron用のアプリケーションです。
リアルタイムのモーション送信やモーション記録が出来ます。

**[Neuron Mocap Live Unity](https://github.com/pnmocap/Neuron_Mocap_Live_Unity)**
**Axis Neuron** からのモーション送信を受けてUnityで3Dモデルを動かすためのプラグインです。

**[FinalIK](https://assetstore.unity.com/packages/tools/animation/final-ik-14290?locale=ja-JP)**
3DモデルをIK制御するためのアセットです。
今回は接地感を出すためにGrounderを使用しています。

# メモ
以下の記事を参考にVRMモデルへのモーション反映を実装しました。
**[UnityPerception Neuron MocapとUnityで通常の3Dモデルキャラを動かす方法](https://www.baku-dreameater.net/entry/2015/11/07/neuron-mocap%25e3%2581%25a8unity%25e3%2581%25a7%25e9%2580%259a%25e5%25b8%25b8%25e3%2581%25ae3d%25e3%2583%25a2%25e3%2583%2587%25e3%2583%25ab%25e3%2582%25ad%25e3%2583%25a3%25e3%2583%25a9%25e3%258)**

自分だけが使用できれば良い環境なので、直接のモーション受信などは特に実装せず、上記記事をそのまま実装しており、NeuronRobotを追従しています。
NeuronRobotについては、メッシュを非表示にすることで3D描画を節約することにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/1efa1a87-1504-0f0b-ddf0-b600f2bc9add.png)


モーションキャプチャーを行う本人と3Dモデルに体格差があると、歩幅や移動距離が異なるため脚が滑るように見えてしまいますが、Axis Neuronのデータをそのまま使うのではなく、 **[Motion Builder](https://area.autodesk.jp/product/motionbuilder/)** を使用してリターゲットと呼ばれる作業を行い体格差を吸収すると、補正が可能です。

Motion Builderの年間ライセンス料は30万円強ですが、残念ながら私の場合は予算不足でMotion Builderは導入しないこととしました。
そのため、VRMモデルの全体スケールを調整しNeuronRobotと大まかに合わせることとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/b530f35e-2dbf-eb38-d02a-98eaf9684fe8.png)

座標変換によるモーション追従で十分うまく動作している気がしているため、モデルのサイズを合わせる実装は、あまり意味が無いかもしれません。

3Dモデルの脚が床を貫通してしまう問題は、 **[FinalIK](https://assetstore.unity.com/packages/tools/animation/final-ik-14290?locale=ja-JP)** のGrounderを使用しました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/9MiZiaJorws?si=WD1Dta-FtKJj8-Xl" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

実装は以下を参考にしました。
**[【Unity】Final IKの「Grounder」を用いて足が地面に接地するようにする](https://www.hanachiru-blog.com/entry/2022/03/10/120000)**

NeuronRobotではなくVRMモデルにGrounderを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/0be8a441-fdbd-938b-3049-4bf89ef35e16.png)

なお試してはいませんが、接地感を与えるだけなら、別のUnityアセットである **[iStep](https://assetstore.unity.com/packages/tools/animation/istep-215843?locale=ja-JP)** でも良いかもしれません。
<iframe width="560" height="315" src="https://www.youtube.com/embed/nKQEz7cyxHU?si=j04WxxAQupdu5jvS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

初代Perception Neuronは、座った状態で脚を上げるなどで接地を失うと、身体が沈むような挙動をします。
そのため、Raycastを用いて脚の接地判定を行い、両足の接地を失った場合は腰を固定する実装を行いました。

Raycastの実装は以下を参考にしています。
**[【Unity】アクションゲームの「接地判定」の作り方！Raycastを使って地面を検出してみよう](https://kurokumasoft.com/2022/07/15/unity-groundcheck/)**

私のコードは見せられるほど綺麗ではないためオープンにしていませんが、両足の接地を失った場合、腰のNeuronRobotへの追従を停止すると共に、その時点の腰位置を保存して、その場で停止するようにしています。

その場合、両足が接地した瞬間にNeuronRobotへの腰の追従を再開しますが、そのままだと現在の位置に瞬間移動してしまい不自然に見えるため、以下を参考にLerpで保存した腰位置から現在値までを線形補完して移動させることとしました。
**[【Unity】Vector3.Lerp／Slerpの使い方と内部挙動](https://nekojara.city/unity-vector3-lerp-slerp)**

なおLerpだと動きに緩急が出ないため、以下を参考にイージング関数を実装することにしました。
動画製作をしているとおなじみの、イーズイン、イーズアウトの処理を行えます。
私はEaseInOutExpoを使用しています。
**[動きに緩急を付ける（Easing, Tween）](http://motoyamablog.blogspot.com/2018/06/monogame-easing.html)**

上記実装を踏まえ、ハンドトラッキンググローブであるHi5 2.0と組み合わせ、ライブステージで動かした動画が以下です。
初代Perception Neuronが苦手とする着席状態や着座状態での脚上げがうまく動作しています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自宅のVTuber撮影3D環境、ちょっと設定甘いけどまあまあ整ってきた <a href="https://t.co/9CjcfFXLUd">pic.twitter.com/9CjcfFXLUd</a></p>&mdash; 大福らな🧷ぱふぇらむ公式VTuber (@daifuk_lana) <a href="https://twitter.com/daifuk_lana/status/1731326463100776606?ref_src=twsrc%5Etfw">December 3, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


ハンドトラッキングを初代Perception Neuronに頼らない理由は、センサの磁気耐性が低く、特に指先は破綻しやすいためです。
Hi5 2.0はPerception Neuron 3.0と同一の新型センサを使用しており、磁気耐性が優れています。
Hi5 2.0は私がリリースしている以下アプリを使用し動かしています。
**[Sknucle](https://sknuckle.pachelam.com/)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/5e476331-a29a-df52-404e-41835fdd2bed.png)

以上です。
大変今更ではありますが、初代Perception Neuronの使用を検討している方の参考になれば幸いです。