Azure Kinectを使ってUnityでBodyTrackingする

Azure Kinectを使ってBodyトラッキングし、Unity上のCubeを右手と左手で操作するところまでいきます。
![kinect.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/991e37e1-63e3-82b2-86ae-a10619281c36.gif)

# 前提
- Windows10
- Unity2021.2.4f1 / Unity2022.3.0

# 手順
## 1. 環境のセットアップ
1. [Azure Kinect DK を設定する](https://learn.microsoft.com/ja-jp/azure/kinect-dk/set-up-azure-kinect-dk)
2. [Body Tracking SDK を設定する](https://learn.microsoft.com/ja-jp/azure/kinect-dk/body-sdk-setup)

## 2. Unity
### 2.1 必要なファイルのダウンロード
1. [Sample Unity Body Tracking Application@Azure Kinect Samples](https://github.com/microsoft/Azure-Kinect-Samples/tree/master/body-tracking-samples/sample_unity_bodytracking)にアクセスして以下3つのファイルをダウンロードする
    1. MoveLibraryFiles.bat
    2. app.config
    3. packages.config

### 2.2 設定
1. プロジェクト作成
2. Assetsフォルダと同じところに前準備でダウンロードしたファイルを配置
3. Riderでソリューションを開いて、NuGetのリストアを実施。やり方は[こちら](https://qiita.com/matchyy/items/e23ff9674417eb34fe11)
4. コマンドプロントからMoveLibraryFiles.batを実行

### 2.3 動作確認
1. 4つのスクリプトをダウンロードします。
    1. [Azure-Kinect-Samples](https://github.com/microsoft/Azure-Kinect-Samples/blob/master/body-tracking-samples/sample_unity_bodytracking/Assets/Scripts)
        1. Body.cs
        2. Constants.cs
        3. CustomColors.cs
    2. [AzureKinectTester.cs](https://github.com/machidyo/azure-kinect-body-tracking-sample/blob/master/Assets/Scripts/Test/AzureKinectTester.cs)
        1. 上記3つはMSのリポジトリのものですが、こちらは上記リポジトリに合ったものを動作確認用に簡略化したものです。
2. テストシーンを作成します。
    1. AzureKinectTesterを作成
        ![2024-04-18_16h33_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/45bbdae3-aaa8-d0a7-0bae-419afe5cac28.png)
    2. その配下にCubeを配置して、右手と左手を作ります。
        ![2024-04-18_16h34_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/24194c74-7a39-74ad-2d50-9368ae0ffa71.png)
3. UnityEditorから実行すると、BodyTrackingが正常に動作していれば、Kinectに手を振れば、Unity上の右手と左手も動くはずです。
    ![2024-04-18_16h35_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/768345c8-231c-6011-5ed3-3424d064a499.png)
    

# エラー対応
## Lightweight.dllが重複しています
### エラー
```
error CS1703: Multiple assemblies with equivalent identity have been imported: 'C:\path\Assets\Plugins\System.Reflection.Emit.Lightweight.dll' and 'C:\Program Files\Unity\Hub\Editor\Version\Editor\Data\NetStandard\compat\2.1.0\shims\netstandard\System.Reflection.Emit.Lightweight.dll'. Remove one of the duplicate references.
```

### 対応方法
Pluginsのほうを削除して解消。

## Kinectが起動できない
### エラー
```
AzureKinectBodyTrackingCreateException: result = K4A_RESULT_FAILED
```

### 対応方法
TrackerConfiguration.DefaultだとGPUを利用するが、環境によってはCUDAが使えないのでエラーになる。CPUを利用する設定にすることで解消。
```csharp
        var tra = new TrackerConfiguration()
        {
            ProcessingMode = TrackerProcessingMode.Cpu,
            SensorOrientation = SensorOrientation.Default
        };
```

## System.Memory が二カ所にあります

### エラー

```
Assets\Scripts\AzureKinect\SkeletalTrackingProvider.cs(89,50): error CS0433: The type 'MemoryMarshal' exists in both 'System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' and 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
```

### 対応法

Pluginsのほうを削除して解消。

# 備考

- https://learn.microsoft.com/ja-jp/azure/kinect-dk/body-joints
- 単位はミリメートル
- 座標は右手系
    - 原点はカメラの焦点
    - X軸右が正
    - Y軸下が正
    - Z軸前方が正