Kinect を使って Unityゲームの中で指さし(腕さし)をする
まえおき
- Oculus Rift たのしい
- Oculus Rift で首振りだけでなく、体の移動や手足も使いたい
- PrioVR とか STEM とか楽しみ。ワイヤレスだし、正確・制約少なそう
- 今はとりあえずKinectでやってみましょう
エリアやハンズフリーであることなどユーザの自由度はKinectが高い。けど、腕の向きや位置の正確さはPrioVRやSTEMの方が高いと思われるし、ボタンも押せる。 それぞれ良いところがあるので、無駄にはならないと思う。Kinect2も出てきているので、そっちにも期待です。
PrioVR: Suit up. Game on. by YEI Technology — Kickstarter
STEM System: The Best Way to Interact with Virtual Worlds by Sixense — Kickstarter
環境
- Windows7 pro x64
- Kinect for Windows
- Unity 4.3.2
- Kinect SDK v1.8
- Kinect Wrapper Package for Unity3D v1.7
この記事は、前回の記事に続き Windows依存の部分が多分に含まれています。ご了承下さい。
目指す物
シーンの中においてある物を遠くから選んでイベント(動かす、ボタンを押す)を起こす。 離れた的(まと)を打つ。 そんなときに使う基本的なパーツをつくります。
本当は「指さし」がしたいけど、Kinectの通常利用の範囲内だと指の情報はとれません。今回はKinect SDKに収まる範囲で、腕のベクトルを使うことにします。
完成した図はこんな感じ
手順
UnityでKinectを使う
前記事 Kinect Wrapper Package for Unity3D をつかってみる - 自習室 の通りです
腕さしを取る
以下のスクリプトを、Kinect Wrapper Package for Unity3D サンプルの KinectPointMan に付与します。
インスペクタ上はこんな感じに。両肘と両手首のオブジェクト、当たり判定対象とするレイヤーを登録します。当たり判定対象となる距離も登録できます。
処理の流れは大まかにこんな感じ
- 両腕(肘->手首)ベクトル Ray を算出
- Ray がぶつかる hitLayer中のオブジェクトを見つけて
- そのオブジェクトに色を付ける
ポイントは、レイヤーマスクを使っているところでしょうか。後述するPaintIt.cs
を付けたオブジェクトを今回の腕さし対象物としてPrefab化したのですが、その際に、そのPrefabを hitTargetというレイヤーにアサインしておきます。PointerHandler.cs
は、ヒット判定する相手をレイヤーで絞り込みますので、そこに hitTarget を登録しておきます。そうすると、このPrefabのインスタンスは皆、当たり判定対象物となります。
当たったオブジェクトに色を付ける
以下のスクリプトを、腕さし当たり判定の対象とするオブジェクトに付与します。
インスペクタ上で、当たり判定されたときにそのオブジェクトにつけられる色と、色がリセットされる時間を登録できます。
カメラをスケルトンの頭にアサインする
本記事では Oculus Rift との統合は扱いません。詳細は毎度おなじみ @hecomi 氏の記事をご参照下さい
Kinect でお手軽に頭の位置とカメラ位置を連動させて Oculus Rift をもっと楽しむ - 凹みTips
その代わりに、非常に簡易な対応ですが、MainCamera
を KinectPointMan
の 03_Head
にアサインします。また、回転がおかしいのでカメラのRotation.y を180度回しましょう。
この辺が適当すぎるせいか、Kinectの首の回転角出力の精度の限界か、視野はあまり正確に再現されません。
さいごに
こういったプロトをさくっと2時間弱程度で作れるのは、Unityの強みですね。