TouchDesigner + Azure Kinect DK
1. はじめに
ここでは、Azure Kinect DKを利用して人体スキャンで作成した自分自身のアバターをコントロールすることを目標としている。実験段階で完成とは至っていないが、途中経過として紹介する。

以下、現時点の状況と課題
- 初代KinectやKinect V2の実験例はあるが、Azure Kinectでの事例が少ない
- Azure Kinectでは初代KinectやV2とスケルトン構造が異なるため同じリグ構造では使えない
- mixamoモデルのスケルトンの対応付けを調整することで上半身の動作まで実験したが、Armatureの構造自体が異なるので無理がある
- 理想としては、Azure Kinect用のスケルトンと同じ構造でリギングし直すことが必要
2. 参考にしたサイト
- TouchDesignerでAzure Kinectを使ってBlenderで作成した自作モデルを動かす
- YouTube - Kinect Azure - StickMAN (Touchdesigner)
- YouTube - Kinect V2 and Touchdesigner: how to rig a character in Blender
- YouTube - TouchDesigner Kinect TOP Tutorial 1 (uncut recording)
- Azure Kinect ボディ トラッキングの関節
- AzureKinectを試す
3. Azure Kinect用オペレータの使い方(画像解析用)
① Kinect Azure TOP
※オペレータの名前にAzureがついていないものは初代Kinect及びV2用
Azure Kinectを接続した状態で、Kinect Azure TOPを追加すれば、すぐに認識される(下図)。TouchDesingerを起動した後にAzure Kinectを接続した場合は、パラメータウィンドウのSensorのプルダウンリストからシリアルナンバーを選択する。

TouchDesigner Non-Commercial盤では1280 x 1280が最大解像度なので、Kinect Azure TOPのパラメータColor Resolusionを1280 x 720(16:9)へ変更する。

パラメータのImageは初期状態でDepth表示となっている。以下に変更可能。
- Depth(深度カメラ)
- Color
- IR(赤外線)
- Payer Index
- Point Cloud(点群)

左からColor、Point Cloud、Depth表示。

② Kinect Azure Select TOP
Kinect Azure Select TOPを追加して、Kinect Azure TOPをKinect Azure Select TOPの上にドラッグ&ドロップする。このことを「Kinect Azure TOPをKinect Azure Select TOPに食わせる」と呼ぶこともある。

Kinect Azure Select TOPにPoint Cloudが表示される。

パラメータのImageから表示を切り替えることができる。

Kinect Azure Select TOPを複数使うことで、複数の表示状態を同時に見ることができる。

4. Azure Kinect用オペレータの使い方(ボディトラッキング用)
Kinect Azure TOPとKinect Azure CHOPを追加する。

Kinect Azure CHOPにKinect Azure TOPを食わせる(ドラック&ドロップ)。

Kinect Azure CHOPにモーションデータが読み込まれる。

データ数が多いため、拡大して確認する。

下表の99データが受信されている。

上記データは、pelvis(骨盤)、spine(脊椎)、neck(首)、clavicle(鎖骨)等、下図のスケルトンの関節位置の座標(参照元Azure Kinect ボディ トラッキングの関節)に対応している。

各関節の位置と向きによって、独自の関節座標系が形成されている。

5. 応用知識① Value、Sample、Channel
- Channel:Value、Sampleのラベル
- Value:CHOPで扱う最小単位の値
- Sample:Valueが複数集まったデータ構造
- Shuffle CHOP:複数ValueからSampleへの変換(Method: Swap Channels and Sample)
TouchDesinerで多くのデータを一度に扱うためには、Valueではなく、Sampleのデータ構造に変換して処理する必要がある。Sampleにすることで順序入替やSample同士のマージ等、効率的にデータ処理を行うことができる。一般的プログラムで言えば、Valueは変数、Sampleは配列に近い。
下図のように、Valueの段階ではchan1、chan2、chan3それぞれに1つの値が入っている。Shuffle CHOPでSampleに変換した後は、chan0に3つの値が入っている状態となる。

下図のように、Sampleはグラフ表示されるため、Valueの時間変化と混同しやすいので注意。

参考URL
6. 応用知識② インスタンシング
Box部分
- Box SOP、Divisions設定、Display Options頂点表示
- SOP to CHOP(Sampleデータ形式)

Sphere周り部分
・Sphere SOP
- Transform SOP
- Geometry COMP
- Camera COMP
- Light COMP
- Render TOP
- Out TOP
- Geometry COM、Instancing: ON
- SOP to CHOPをGeometry COMPにドラックアンドドロップ、Params: Default Instance OP(要確認)、Translate X:tx、Translate Y: ty、Translate Z: tz
- TransformのUniform Scale: 0.1
- Camera COMPをActiveにしてビューを回転して確認

参考
7. 実験① Sphereインスタンシング
スケルトンの関節位置にSphereをインスタンシングして表示する。
以下、授業内で指示する。
- Select CHOPのChannel Names: *tx (ty, tz)
- Shuffle CHOPのMethod: Swap Channels and Samples、Use First Sample Only: ON
- それぞれのSampleをx, y, zにRenameしてもよい

以下のデータをダンロードして実験する。
Sphereのスケールを変更したり、Box SOPに変更してみよう。

下図はさらにアレンジしたTMU Man。

8. 実験② Skeleton for Kinect Azure(gormonboza氏)のプロジェクト
① プロジェクトファイルのダウンロード
元ネタはTouchDesignerのフォーラム記事
gormonboza氏がGoogle Driveで公開しているデータを利用する。下記4つあるが、上2つだけで動作する。残り2つはAzure Kinectサイトで公開されているスケルトン構造の画像と同じ。
- Kinect Azure.toe
- Skeleton _Azure_09.fbx
- y2al3lm5.bmp
- joint-coordinates.png
下記URLのGoogle Driveから必要なデータをダウンロードする。

② プロジェクトファイルの起動
Kinect Azure.toeをダブルクリックして起動する。Skelton_Azure_09.fbxも読み込まれるので同じ階層に置く必要がある。

③ Kinect Azure TOPの設定
以下の2つを設定する。
- Sensor:プルダウンリストからAzure Kinectのシリアルナンバーを指定
- Color Resolution: 1280 x 720(16:9)を選択 ※Non-Commercial版

④ Render TOPの設定
- Resokutionを1280 x 720(16:9)に設定 ※Non-Commercial版

下図のようにリアルタイムにFBXのサンプルキャラクターを動かすことができる。

9. 実験③ mixamoキャラクターを動かす

キャラクターはどのキャラクターでもよい。アニメーションは付けていない状態で、以下の設定でダウンロードする。
- Format: FBX 7.4(おそらくBinaryでも可)
- Pose: Original Pose

FBXをTouchDesignerにドラックアンドドロップする。自動的にFBX COMPとして読み込まれる。

ズームインするか、FBX COMPを選択した状態でENTERキーを押して、FBX COMPの中に入る。

下図のように、キャラクターのGeometry COMPに対して、スケルトンの関節にあたるNull COMPが多数リンクしていることがわかる。

下図は、mixamoからダウンロードしたFBXをBlenderに読み込んで構造を解析したもの。人体スキャンデータにAuto Riggingしたものなので指関節はなく、関節名称も異なる。
mixamoからダウンロードしたFBXは、関節構造は元々mixamoに準備されているキャラクターであれば共通(違うものもあるかも)だが、関節名称がキャラクター毎に異なる。このため、FBXの差し替えによるキャラクターの入替えというような単純な方法は行うことができない。

Azure Kinectのモーション取得データからmixamoキャラクターを動かすには、異なる構造のスケルトンの関節データを対応付けし直してから、受け渡す必要がる。本来は、mixamoキャラクターに対して、Azure Kinectのスケルトン構造でリギングし直すことが理想的だが、ここでは扱わない。

以下、実験。
Kinect Azure CHOPにKinect Azure TOPを食わせる。

まだまだ実験段階。以下、課題まとめ。
- Kinect Azure CHOPのデータとキャラクターFBXの中の関節Null COMPとの対応付け分析
- 関節の座標系に合わせた回転角度の分析
下図のように画面を2分割した上で、左にKinect Azure CHOP、右にFBXの中が見える状態で設定する。

以降、詳細は授業内で指示。
FBX読み込み部分
- FBX、Import Scale: 0.01
- Comera COMP
- Light COMP
- Render TOP
- Transform TOP、Background Color: 0, 0, 0, 1、Comp Over Backgorund Color: ON 背景黒用
- Out TOP
Azure Kinect部分
- Kinect Azure TOP
- Kinect Azure CHOP、Relative Bone Rotations: ON、World Space Positions: OFF
- Select CHOP、Channel Names: head、必要に応じてTrail CHOPで確認
- Filter CHOP、Type: Gaussian(ガウシアンフィルター)、Filter Width: 0.8程度、必要に応じてTrail CHOPで確認
- Null CHOP
モーションデータのパラメータリンク部分
- FBXのmixamorig_Head(Null COMP)にパラメータリンクする
- ・Azure Kinect → FBX
- ・rz → rx
- ・rx → ty
- ・ry → rz
- それぞれパラメータリンクしながら、姿勢の誤差を+-で調整する。

サンプルデータ:https://data.nakayasu.com/files/before2021/touchdesigner/AzureKinectAmy_test.zip
10. 実験④ Point CloudをCircle SOPインスタンスで表示
Azure Kinect Viewer ***でプレビューしていた状態をTouchDesigner風に実現したもの。
サンプルデータ: https://data.nakayasu.com/files/before2021/touchdesigner/AzureKinectPointCloud.zip

うまく使えば、映像表現としても利用できる。
