自習室

こもります

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

環境

この記事は、前回の記事に続き Windows依存の部分が多分に含まれています。ご了承下さい。

目指す物

シーンの中においてある物を遠くから選んでイベント(動かす、ボタンを押す)を起こす。 離れた的(まと)を打つ。 そんなときに使う基本的なパーツをつくります。

本当は「指さし」がしたいけど、Kinectの通常利用の範囲内だと指の情報はとれません。今回はKinect SDKに収まる範囲で、腕のベクトルを使うことにします。

完成した図はこんな感じ

f:id:AMANE:20140219145717p:plain

f:id:AMANE:20140219150025p:plain

手順

UnityでKinectを使う

前記事 Kinect Wrapper Package for Unity3D をつかってみる - 自習室 の通りです

腕さしを取る

以下のスクリプトを、Kinect Wrapper Package for Unity3D サンプルの KinectPointMan に付与します。

インスペクタ上はこんな感じに。両肘と両手首のオブジェクト、当たり判定対象とするレイヤーを登録します。当たり判定対象となる距離も登録できます。

f:id:AMANE:20140220225335p:plain

処理の流れは大まかにこんな感じ

  1. 両腕(肘->手首)ベクトル Ray を算出
  2. Ray がぶつかる hitLayer中のオブジェクトを見つけて
  3. そのオブジェクトに色を付ける

ポイントは、レイヤーマスクを使っているところでしょうか。後述するPaintIt.csを付けたオブジェクトを今回の腕さし対象物としてPrefab化したのですが、その際に、そのPrefabを hitTargetというレイヤーにアサインしておきます。PointerHandler.csは、ヒット判定する相手をレイヤーで絞り込みますので、そこに hitTarget を登録しておきます。そうすると、このPrefabのインスタンスは皆、当たり判定対象物となります。

当たったオブジェクトに色を付ける

以下のスクリプトを、腕さし当たり判定の対象とするオブジェクトに付与します。

インスペクタ上で、当たり判定されたときにそのオブジェクトにつけられる色と、色がリセットされる時間を登録できます。

f:id:AMANE:20140220225756p:plain

カメラをスケルトンの頭にアサインする

本記事では Oculus Rift との統合は扱いません。詳細は毎度おなじみ @hecomi 氏の記事をご参照下さい

Kinect でお手軽に頭の位置とカメラ位置を連動させて Oculus Rift をもっと楽しむ - 凹みTips

その代わりに、非常に簡易な対応ですが、MainCameraKinectPointMan03_Head にアサインします。また、回転がおかしいのでカメラのRotation.y を180度回しましょう。

f:id:AMANE:20140219155220p:plain

f:id:AMANE:20140219155305p:plain

この辺が適当すぎるせいか、Kinectの首の回転角出力の精度の限界か、視野はあまり正確に再現されません。

さいごに

こういったプロトをさくっと2時間弱程度で作れるのは、Unityの強みですね。