札幌オフィスのZです。社内研究の一環でスマートフォンデバイスでポジショントラッキングを実現しました。
やりたいことは、VR(仮想現実)モードの画面中で、歩行などの動きの位置を検出して連動させることです。
スマホ単体では、至近距離の移動の検出は困難に思えます。
何かいい方法が無いのか?・・・試行錯誤してみました。
1- 加速度センサー
まず最初に試したのは加速度センサーを用いた方法です。
これは加速度を積分すると速度になり、速度を積分すると距離になることを利用できないかと思い浮かびました。
早速数式を当てはめて試してみましたが、加速時と減速時の加速度が釣り合わないため、端末を動かした後静止してもゲーム内では移動し続けてしまうという状態になってしまいました。
原因を調査したところ加速度センサーからは「瞬間加速度」という値しか取れないということでした。
瞬間加速度ということは、加速度センサーから値を取得しようとしたその瞬間にかかっていた加速度ということになりますので、今回のような移動距離を算出できるほど完全な加速度は取れないようです。
2- ビーコンの電波強度
次に、純粋にスマホ単体のみという訳ではないですが、ビーコンを使って移動距離を検出できないかと考えました。
社内でビーコンを使ったアプリを受託制作していて、ビーコンが転がっていた(すみません!借り物ですので実際には転がしていません)ので、これを拝借して実験してみました。
本社S君のビーコンのBLOG記事は以下です。
ビーコンからは常に微弱電波が出ていて、電波の届く範囲に入ると、スマホ端末側でビーコンの情報を検出することができます。
ビーコンからの電波を受信した時の電波強度から距離を算出する方法を使ってみました。
これは電波の受信信号強度は距離の二乗に反比例して減衰していくことを利用するものです。
しかし、こちらも距離が離れるほど誤差が大きくなり、ポジショントラッキングとしては使用できませんでした。
3- カメラからの映像を解析する方法
次に思いついたことは、何か目印のようなものを用意して、スマホ端末のカメラに映った大きさや傾きに応じて、カメラが移動した距離を算出する方法です。
カメラに映った映像をリアルタイムで解析して処理する部分は時間がかかる想定でしたが、UnityにはARカメラを作るための「Vuforia」という素晴らしいアセットがあり、開発にUnityを使用しアセットを追加することで以外と簡単に実装することが出来ました。
Vuforia
https://developer.vuforia.com/
空中に立方体が浮いているだけでワクワクしてきます。
弊社ブランド「フクロウスタジオ」のロゴを印刷してARマーカーとして使うことにしました。
ARマーカーとの位置関係によって3D空間上のカメラとオブジェクトの位置関係も変わるため、カメラが撮影した映像の表示をオフにすると、擬似的ではありますがポジショントラッキングを実現することが出来ました。
VRゲームの開発
さあ、ARカメラ機能を使うことでポジショントラッキングが実現できそうなので、この技術を使ってスマホでVRゲームを開発することにしました。
VRゲームを開発するにあたって「Google VR」を使うことにしましたが、VRモードで遊ぶにはCardboardが必要になりますが注意点が1つ!
今回はAR機能でカメラも使用しているため、カメラ部分が使える形状のVRゴーグル・Cardboard(ダンボールVR)が必要になります。
上記のようにカメラ部分に穴があいているVRゴーグルが必要です。
Google VR
https://vr.google.com/
Google Cardboard
https://vr.google.com/intl/ja_jp/cardboard/
ゲームをリリース
ポジショントラッキング機能を使用してスマホアプリの「Bungee Simulator」というVRゲームをリリースしました!
ビルの屋上から突き出た板の上を歩く、恐怖シミュレーションゲームになります。
板を踏み外すと落下します!
iOS版
https://itunes.apple.com/jp/app/hua-tinovrwosumahode-zai-xian/id1165264105?l=ja&ls=1&mt=8
Android版
https://play.google.com/store/apps/details?id=com.mcraft.bungee
もっとリアル(シビア)にポジショントラッキングを行うにはスマホではなく、ポジショントラッキング機能のついたVR機器やセンサーが必要です。
イベントやアトラクションで使う設置型のVR開発も行っていますのでお気軽にご相談下さい。