Xbox360版KinectによるVMCProtocolを使用した姿勢情報の送信、VRMモデル操作について

押し入れに眠っているXbox360版Kinectを使って、VRMモデルを動かして遊んでみましょう。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Kinect v1で動く脱法ばもきゃ作りました。<a href="https://twitter.com/hashtag/EVMC4U?src=hash&amp;ref_src=twsrc%5Etfw">#EVMC4U</a> で動くことを確認しました。 <a href="https://twitter.com/hashtag/VMCProtocol?src=hash&amp;ref_src=twsrc%5Etfw">#VMCProtocol</a> <a href="https://t.co/772GaBBaOr">pic.twitter.com/772GaBBaOr</a></p>&mdash; 大福らな🧷ぱふぇらむ公式Vライバー (@daifuk_lana) <a href="https://twitter.com/daifuk_lana/status/1264927841935716353?ref_src=twsrc%5Etfw">May 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
#はじめに
本記事では、Xbox360版Kinectを使用し、EVMC4Uへの姿勢情報の送信を目指します。
Unityのシーン上で3Dオブジェクトの配置などを作り込み、その上でモデルを動かすことも可能ですが、本記事ではEVMC4Uを使用します。
EVMC4Uとは、OSCで姿勢情報を受信してUnityシーンに反映するスクリプト群です。
詳細は**[こちら](https://github.com/gpsnmeajp/EasyVirtualMotionCaptureForUnity)**からどうぞ

なお、Xbox360版Kinectは2010年発売のハードウェアのため、現行機種と比較すると測定距離や解像度、精度の点で劣ります。
また、製造終了しているため、購入する際は中古品から選ぶこととなり故障のリスクもありますので、これから購入するのはおすすめしません。
更に、後述のKinect for Windows SDKを使用して開発を行う場合は、Kinect for Windows（Windows版Kinect）を使用する必要がある、といった[解説記事](https://thinkit.co.jp/story/2012/07/03/3605)も見かけました。原文は見つけられませんでしたが、開発時はWindows版Kinectを使用するほうが良いかと思います。
以上のことにご留意の上、自己責任でお楽しみください。ご安全に！
#使用ソフト等
**[Unity](https://unity3d.com/jp/get-unity/download)**
Unity上で動かします。私はバージョン2018.4.10f1を使用しています。

**[Kinect for Windows SDK v1.8](https://www.microsoft.com/en-us/download/details.aspx?id=40278)**
SDK v1.8がXbox360版Kinectに対応しています。

**[Kinect with MS-SDK](https://assetstore.unity.com/packages/tools/kinect-with-ms-sdk-7747?locale=ja-JP)**
Xbox360版KinectをUnity上で使用するための便利なアセットです。

**[VMCProtocol](https://sh-akira.github.io/VirtualMotionCaptureProtocol/)**
OSCで姿勢情報を送受信出来る便利なプロトコルです。こちらを使用してEVMC4Uに動きを反映させます。
[UniVRM](https://github.com/vrm-c/UniVRM)、[uOSC](https://github.com/hecomi/uOSC)の導入も必要となります。
説明は後述します。

#VMCProtocolとは
VMCProtocol(Virtual Motion Capture Protocol)とは、対応するソフトウェア間で姿勢情報をやり取りできる、便利なプロトコルです。
以下、公式からの引用です。

>Virtual Motion Capture Protocolは、VTuberの人々がVR機器の高度な知識を要すること無くVR撮影環境を自作することを可能とするために作成されました。
>高度な技術が要求されるアバターの制御、VR機器の取り扱いをバーチャルモーションキャプチャーに任せ、
>利用者は以下の受信ライブラリを使うだけでとてもシンプルにアバター撮影環境を構築することができます。
>・EVMC4U - Unity向け
>・VMC4UE - Unreal Engine向け

#導入
Unity、Kinect for Windows SDK v1.8を予めインストールします。
また、VRMモデルも準備しておきます。

VRMモデルをお持ちでない場合、私の以下記事が便利です。
[【無料3Dモデル作成】HitogataモデルをVRM形式に変換する方法（フルトラ対応版）](https://qiita.com/daifuk-lana/items/17bb95a65c10295f24d1)

#プログラムの作成
Unityで新規プロジェクトを作成し、UnityAssetStoreより[Kinect with MS-SDK](https://assetstore.unity.com/packages/tools/kinect-with-ms-sdk-7747?locale=ja-JP)をインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/32983fa7-4bd0-cccf-2a20-268a94bf82de.png)

VMCProtocolの[Sample](https://sh-akira.github.io/VirtualMotionCaptureProtocol/Sample)より、UniVRM、uOSCをそれぞれインポートします。
また、サンプルスクリプトの[SampleBonesSend.cs](https://github.com/sh-akira/VirtualMotionCaptureProtocol/blob/master/sample/SampleBonesSend.cs)を使用するので、こちらもダウンロードし、インポートしておきます。

UniVRMのインポートに成功すると以下の通りVRMタブが表示されるのでご確認ください。uOSCは私は0.0.2をインポートしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/7f463292-7f9a-dcc6-2c6e-f472347f90dc.png)

VRMモデルもインポートし、シーン上に配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/299c6e4c-1ec2-1491-e895-6a8a0bb92c9d.png)

空のGameObjectを作成し、Asset/KinectScript/KinectManager.csをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/71a77cc5-fe5f-461e-fb3f-0e07921ff373.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/20969706-5113-6017-ceab-34aab1f6d0e3.png)


配置したVRMモデルにAsset/KinectScript/AvatarController.csをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/8d819b9e-d3ca-2c88-0c15-2c0bcccc4c35.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/09af5a70-47c4-9306-6809-00851e5f2b80.png)

まずはこの状態で実行し動くことを確認してください。~~Kinectの前でTポーズをすれば動くはずです。~~ポーズが要るのはOpenNiでした。昔触ったときのと勘違いしてました。Kinect for Windows SDKはポーズ不要でカメラの前に行くだけで動きます。
その後、VMCProtocolでの姿勢情報送信を実装します。先ほどの空のGameObjectにAsset/uOSC/Script/uOscClient.csをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/547669b2-85e4-b2bf-f377-28e5c96c38f9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/718d83b2-6497-f92c-f666-f681b19b1f42.png)

uOscClientのPortはEVMC4U側で設定した番号と合わせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/05b13763-6c74-38d6-652b-a0a3bdd89394.png)

続いてSampleBonesSend.csを先ほど同様、空のGameObjectにアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/5a14614a-8428-3e71-1d56-768ccb34ac41.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/f19ae24a-4ac1-cf9f-eeae-506f11a3b7b1.png)

SampleBonesSendのModelには、シーン上に配置したVRMモデルを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/6434a36a-0acd-2a90-02fe-6bf8ab4945c2.png)

以上で、EVMC4U上でもKinectで操作した姿勢情報が反映されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/623eaeac-8bb7-e975-55a7-192a4994d0d5.png)

Kinectの設定値などは各自調べて試してみてください。
参考までですが、AvatarControllerのSmooth Factorが補正（小さいほど緩やかに動く）です。

なお、VMCProtocolのサンプルスクリプトの[SampleBonesReceive.cs](https://github.com/sh-akira/VirtualMotionCaptureProtocol/blob/master/sample/SampleBonesReceive.cs)を実装すると、同じくVMCProtocolに対応した[waidayo](https://apps.apple.com/jp/app/waidayo/id1513166077)からフェイシャルモーションキャプチャーのデータを受信することが出来ます。

楽しんで！