そのまえに、KinectからUnityに3D情報を渡した時の座標変換について、学んだことを簡単にまとめます。
Kinectで取ったBodyの関節ごとの3D座標を、Unityのワールド座標にもっていき、カラー画像にマッチングさせるところまでです。
※UnityにKinect for windowsのUnityパッケージをすでに読み込ませた状態を想定
Unityの最小単位がメートルなので、19.2m×10.8mの壁に描画されている状態。
※UnityにKinect for windowsのUnityパッケージをすでに読み込ませた状態を想定
①Unity上でカラー画像を表示させる。
CubeのScaleを横19.2、縦10.8に設定して作成。これに2つのC#スクリプトをアサインして実行するとkinectのカラー画像が表示される。Unityの最小単位がメートルなので、19.2m×10.8mの壁に描画されている状態。
②Unityの座標に変換するためのカメラを用意
新しくカメラを作成する。カメラの投影方法は平行投影に変え、Sizeを微調整する。
ちなみに上図の上がワールド空間で見た状態、下が新しく作ったカメラのスクリーン。
スクリーン上の座標は左下が原点で、縦と横の座標が画像のピクセルで表される。
スクリーンで映る範囲を①で作ったCubeがぎりぎり収まるようにカメラのパラメータ(位置とスケール、sizeなど)を決める。
続いて、骨格を表示させる部分に移る。
③骨格を表示させるObjectの作成
次に、骨格を表示させる空のObjectを作る。このObjectにBodySourceManager.csと、次の手順で修正するBodySourceView.csをアサイン。
④BodySouceView.csの修正
最後にBodySouceView.csの修正する。このスクリプトの中に、座標変換を記述する。
Kinectから取り出したJointデータ(各間接のx,y,z座標)をMapCameraPointToColorSPaceメソッドを使ってkinectのカラー座標(左上が原点で、縦と横がピクセル単位)に変換する。
変換したkinectのカラー座標の数値を、そのままUnityのVector3型の変数のxとyに代入する(スクリーンは2Dなので、zは0にする)。
kinectの画像の大きさをScreenの大きさに合わせるため、倍率調整する。
point.X = point.X * Screen.width / 1920
point.Y = point.Y * Screen.Height / 1080
こうすると、kinectから取り出した骨格のデータがスクリーンの枠内に表示される。
最後に、ConvertCamera.ScreenToWorldPointメソッドを使ってワールド座標に変換する。
※Unityのスクリーン座標は左下から右上に向かって増えていくので、Y座標にマイナスをかけて反転させる。
Z座標は奥行き方向なので、適当な数値を入れる。(0だと表示されないかも)
0 件のコメント:
コメントを投稿