TouchDesigner + Azure Kinect DK

はじめに

ここでは、Azure Kinect DKを利用して人体スキャンで作成した自分自身のアバターをコントロールすることを目標としている。まだまだ実験段階で完成とは至っていないが途中経過として紹介する。参考情報程度としてほしい。

以下、現時点の状況と課題

  • 初代KinectやKinect V2での実験例はあるが、Azure Kinectでの事例が少ない
  • Azure Kinectでは初代KinectやV2とスケルトン構造と異なるため同じリグ構造では使えない
  • mixamoのモデルのスケルトンに対して対応付けを調整することで上半身の動作まで実験しているが、構造の異なるスケルトンなので無理がある
  • 理想はAzure Kinect用のスケルトンと同じ構造でリギングし直すことが必要

Back To Top

Azure Kinect用オペレータの使い方(画像解析用)

① Kinect Azure TOP

※オペレータの名前にAzureがついていないものはKinect初代及びV2用

Azure Kinectを接続した状態でKinect Azure TOPを追加すれば、すぐに下図のように認識される。
TouchDesignerを起動した後にAzure Kinectを接続した場合は、パラメータのSensorのプルダウンリストからシリアルナンバーを選択する。

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

パラメータのImageは初期状態でDepth表示だが、以下に変更可能。

  • Depth(深度カメラ)
  • Color
  • IR(赤外線)
  • Player 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を複数使うことで、複数の表示状態を同時に見ることができる。

Back To Top

Azure Kinect用オペレータの使い方(ボディトラッキング用)

Kinect Azure TOPとKinect Azure CHOPを追加する。

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

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

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

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

index name index name index name
0 frame 33 p1/thumb_l:tx 66 p1/foot_l:tx
1 timestamp 34 p1/thumb_l:ty 67 p1/foot_l:ty
2 p1/id 35 p1/thumb_l:tz 68 p1/foot_l:tz
3 p1/pelvis:tx 36 p1/clavicle_r:tx 69 p1/hip_r:tx
4 p1/pelvis:ty 37 p1/clavicle_r:ty 70 p1/hip_r:ty
5 p1/pelvis:tz 38 p1/clavicle_r:tz 71 p1/hip_r:tz
6 p1/spine_navel:tx 39 p1/shoulder_r:tx 72 p1/knee_r:tx
7 p1/spine_navel:ty 40 p1/shoulder_r:ty 73 p1/knee_r:ty
8 p1/spine_navel:tz 41 p1/shoulder_r:tz 74 p1/knee_r:tz
9 p1/spine_chest:tx 42 p1/elbow_r:tx 75 p1/ankle_r:tx
10 p1/spine_chest:ty 43 p1/elbow_r:ty 76 p1/ankle_r:ty
11 p1/spine_chest:tz 44 p1/elbow_r:tz 77 p1/ankle_r:tz
12 p1/neck:tx 45 p1/wrist_r:tx 78 p1/foot_r:tx
13 p1/neck:ty 46 p1/wrist_r:ty 79 p1/foot_r:ty
14 p1/neck:tz 47 p1/wrist_r:tz 80 p1/foot_r:tz
15 p1/clavicle_l:tx 48 p1/hand_r:tx 81 p1/head:tx
16 p1/clavicle_l:ty 49 p1/hand_r:ty 82 p1/head:ty
17 p1/clavicle_l:tz 50 p1/hand_r:tz 83 p1/head:tz
18 p1/shoulder_l:tx 51 p1/handtip_r:tx 84 p1/nose:tx
19 p1/shoulder_l:ty 52 p1/handtip_r:ty 85 p1/nose:ty
20 p1/shoulder_l:tz 53 p1/handtip_r:tz 86 p1/nose:tz
21 p1/elbow_l:tx 54 p1/thumb_r:tx 87 p1/eye_l:tx
22 p1/elbow_l:ty 55 p1/thumb_r:ty 88 p1/eye_l:ty
23 p1/elbow_l:tz 56 p1/thumb_r:tz 89 p1/eye_l:tz
24 p1/wrist_l:tx 57 p1/hip_l:tx 90 p1/ear_l:tx
25 p1/wrist_l:ty 58 p1/hip_l:ty 91 p1/ear_l:ty
26 p1/wrist_l:tz 59 p1/hip_l:tz 92 p1/ear_l:tz
27 p1/hand_l:tx 60 p1/knee_l:tx 93 p1/eye_r:tx
28 p1/hand_l:ty 61 p1/knee_l:ty 94 p1/eye_r:ty
29 p1/hand_l:tz 62 p1/knee_l:tz 95 p1/eye_r:tz
30 p1/handtip_l:tx 63 p1/ankle_l:tx 96 p1/ear_r:tx
31 p1/handtip_l:ty 64 p1/ankle_l:ty 97 p1/ear_r:ty
32 p1/handtip_l:tz 65 p1/ankle_l:tz 98 p1/ear_r:tz

 

上記データは、pelvis(骨盤)、spine(脊椎)、neck(首)、clavicle(鎖骨)等のように下図のスケルトンの関節位置の座標に対応している。

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

Back To Top

応用知識① Value、Sample、Channelを理解する

  • Channel:Value、Sampleのラベル
  • Value:CHOPで扱う最小単位の値
  • Sample:Valueが複数集まったデータ構造
  • Shuffle CHOP:複数ValueからSampleへの変換、Method: Swap Channels and Sample

TouchDesignerで多くのデータを一度に扱うためには、ValueではなくSampleのデータ構造に変換して処理する必要がある。Sampleにすることで順序入替やSample同士のマージ等、効率的にデータ処理を行うことができる。一般的プログラムで言えば、Valueは変数、Sampleは配列に近い。

下図のように、Valueの段階ではchan1、chan2、chan3それぞれに一つの値が入っている。Shuffle CHOPでSampleに変化した後はchan0に3つの値が入っている状態になる。

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

参考URL

Back To Top

応用知識② インスタンシング

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 COMPのInstancing ON
  • SOP to CHOPをGeometry COMPをドラックアンドドロップ、Parm: Default Instance OP、Translate X: tx、Translate Y: ty、Translate Z: tz
  • TransformのUniform Scale: 0.1
  • Camera COMPをActiveにしてビューを回して確認

下図はクリックして拡大可能。

参考URL

Back To Top

実験① 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に変更してみよう。

 

参考サイト

Back To Top

実験② Skeleton for Kinect Azureのプロジェクト

① プロジェクトファイルのダウンロード

元ネタはTouchDesignerの以下のフォーラム記事

gormonboza氏がGoogle Drive公開しているデータを利用する。4つあるが上2つだけで動作する。残りの2つの画像はAzure Kinectサイトで公開されているスケルトン構造の画像。

  • Kinect Azure.toe
  • Skeleton_Azure_09.fbx
  • y2al3lm5.bmp
  • joint-coordinates.png

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の設定

  • Resolutionを1280 x 720に変更 ※Non-Commercial版

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

Back To Top

実験③ 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
  • Camera COMP
  • Light COMP
  • Render TOP
  • Transform TOP、Background Color: 0, 0, 0, 1、Comp Over Background 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 → ry
    • ry → rz
  • それぞれのパラメータリンクしながら、自分の姿勢との誤差を+-で調整する。

下図参照(クリックして拡大)

Back To Top

実験④ Point CloudをCircle SOPインスタンスで表示

※今回は扱わない

カラー表示と重ねた場合、Point CloudとColorが若干ずれているのは、カラー画像用カメラと深度センサーカメラが同じ位置にないため。

この手法を用いれば三次元スキャンのPoint Cloudデータ(.xyz)からDigital Geidaiのような点描表現映像が作成可能。(Digital Geidaiは点描ではないかも?)

 

Back To Top