凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Leap Motion の Oculus Rift 用マウンタを使って VR の世界で積み木ゲームしてみた

はじめに

Leap Motion マウンタThingiverse で公開されているのを見つけて DMM.make の 3D プリントサービスで造形してもらい、Leap Motion SDK v2.0 Beta のサンプルをちょっと弄って Oculus Rift を被って VR の世界で積み木してみました。

デモ

3D モデルの造形

Thingiverse に投稿されている bzerk さんによるモデルを、最初はそのまま DMM.make に依頼したのですが、どうやら最薄部が最小加工可能サイズを下回っていたようでキャンセルされてしまいました(@yuujii さんに教えていただきました)。

そこで Blender で薄い場所を加工して再度プリント依頼したところ、1週間ほどで無事造形されてやって来ました。素材は ABS にしてます。

f:id:hecomi:20140525130227j:plain

f:id:hecomi:20140526013305j:plain

f:id:hecomi:20140526013749j:plain

配布データは Leap Motion マウンタとクリップバーの 2 つにわかれていて、Leap Motion マウンタをスライドさせてクリップバーに取り付けます。そして Oculus Rift には、脇にある 4 つの溝にはめ込む形になります。素材を ABS にしたのと 2 つのパーツに分かれていたことから結構良い値段になってしまい、合計で 10,373円 でした。

ダウンロード

最薄部を厚く加工したクリップバーのデータ(STL)は以下にアップしました。

サンプルの改造

以前の解説(手のボーントラッキングが可能になった Leap Motion SDK V2 Beta の Unity サンプルについて調べてみた - 凹みTips)でも書いたとおり、Hand Controller をアタッチしたオブジェクトの位置/回転を調整することで手の出す向きを変更できます。Leap Motion はヘッドマウントされた位置にあるので、x 軸と z 軸をひっくり返して、かつカメラの向きに追従するように OVRCameraController の子にしています。

手抜きのために最初はサンプルのカメラを OVRCameraController に変えただけでやっていたのですが、持った時にくるくる回ってしまう挙動が置く際の妨げとなり 1 時間位粘っても 3 段しか積めなかったので、妥協して以下のように回転をロックしたところ、冒頭のデモのように積みやすくなりました。

MagneticPinchHand

void OnPinch(Vector3 pinch_position) 
{
    ...
    if (grabbed_) {
        grabbed_.rigidbody.freezeRotation = true;
    }
}

void OnRelease() 
{
    if (grabbed_) {
        grabbed_.rigidbody.freezeRotation = false;
    }
    ...
}

得られた知見

前の空間が開けていれば、以前とくらべて手をしっかりと捉えてくれます。ただ、こういう細かい動きをしようとすると一本一本の制御が重要になるのですが、その精度は Leap Motion から見える手の向きに大きく左右され、Leap Motion から見た手が垂直(指が見えない向き)だと指が暴れたりロストしたりしてしまい、積み木を積むのはまず不可能でした。

そこで、Oculus Rift のゲーム内でのカメラの位置と、その子として配置した Hand Controller の位置をうまく調整してあげることで、ゲームの中の物体を操作しようと手を出した位置が Leap Motion から最も補足しやすい位置になるように調整してあげる必要があります。v2.0 Beta では Confidence パラメタがとれるので、これをうまく活用しながらユーザに操作して欲しい手の位置や向きを提示するのも良いと思います。

それでもロストや指の暴れなど意図しない挙動は必ず起こるので、ここもルールに含めてうまくゲームデザインするのが重要だと思います。そういう意味では、積み木とかドミノとかジェンガとかは良い題材だと思います。

おわりに

Leap Motion よりもマウンタの方が高くなってしまいましたが...、Oculus Rift も持っている方は VR の中にインタラクティブな手をいれることの出来る現状最も簡単な手段だと思いますので、是非試してみてください!