Oculus Rift 2 Advent Calendar 2014 - Qiita
の七日目の記事です。
追記:
タイトルに【Unity】を追加しました。
OculusRiftにかかってる加速度がほしい!
以下の動画のゲームがVRshareにあがっててちょっと話題になった。
EVILMECH RUNNER gameplay with Oculus Rift DK2 - YouTube
上下加速度を推進力に変えてるっぽい。なので大きく上下に振るとすっげー移動する。中々ひどい入力機構である。これはおもしろい!やってみたい!と思ってOcuJamの深夜にこっそりそれっぽいのを実装しようとしてみた。
SDKの中身変わりすぎ!
どうやら加速度は以下でとれるらしい。
OculusRiftの加速度センサの値をUnityから取れた。 float x = 0, y = 0, z = 0; OVRDevice.GetAcceleration( 0, ref x, ref y, ref z );
— GOROman (@GOROman) 2013, 10月 17
何だ簡単じゃん!と思って打ち込むと、エラー。OVRDeviceなんてものはない、といわれる。
どうやらSDK0.4.3から一新されたらしく、ググって見つかる情報が使えない。
0.4.3の内容を探してもまだ全然落ちてない。ドキュメントにもそれらしい文面が見つからない。
しょうがないのでソースコードを読む
とりあえずソースコードに対してvelocityとかacceclerationとか検索かけながら読む。
そうしているうちにSensorDataという構造体がHit。これにRawDataがどっかで書き込まれるので、毎フレーム読めばいいようだ。
成果物
呼ばれてる場所探して探してできたコードがこちら。実際データを取得しているのはGetVelocity()。floatが三つあるだけの独自構造体vector3fで保管されているで、扱いやすいようにUnityEngine.Vector3に変換して返してる。
とりあえず一定以上の上下加速度が入ると、カメラアンカー方向に進む、というものができた。他のスクリプトでアンカーを動かさないと、一方向にしか進めない。
mech runnnerは視線方向に進むようになっていて、riftの方向を変えれば進行方向も変えられた。rift単体で動かしたいならばそれのほうが都合がいいが「後方を確認しながら前に進む」なんてことができない。追われるゲームなどに対して使いたいならば致命的な欠点であると思うので、確認はしたが組み込んだものはあげない。
どうしても視線方向に進みたいならば、
OVRPose pose = OVRManager.display.GetHeadPose();
して
Vector3 v = pose.orientation * transform.forward;
すればカメラの向いている方向ベクトルが得られる。移動方向として設定すれば視線方向に動ける。上下方向にも動けてしまうので、v.yを0にすることをお勧めする。
プレイ所感
ジョグは、思っている以上に上下に跳ねない。かなりオーバーに、頭一つ分くらい上下に動かないとうまく動けないが、そこまでオーバーにやると片足着地では辛い。なので両足で激しく上下するという風になり、ジョグしているというよりは、ホッピングで跳ねてる気分になる。かなり疲れる。あと何もかも適当だからそのまま組み込むと超気持ち悪い。
今後の展望
とりあえず上下方向加速度をそのまま前後方向の推進力に変えることができたが、そのままだと違和感が大きく使えるとは言えない。違和感なく動けるようにしなければならない。
また、この推進機構は、有名な筋力トレーニングと相性がよいと考える。そう、うさぎ跳びだ。うさぎ跳びVRを作成したいと思う。
「可愛い女の子がおいでおいでしているモーション」と「可愛い女の子がハグをしてくれるモーション」or「可愛い女の子が頭をなでてくれるモーション」、「飛びつきたくなる可愛い女の子のモデル」が製作に必要なので、心あたりがある方は情報提供をしていただけると幸いである。ペットに対してやっているようなものだとなお好ましい。
次の人
現段階ではいません!!!誰か書いてください!!!