凹みTips

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

VR 内で自分の手とキーボードのインタラクションを可視化するデモを作ってみた

はじめに

VR に特化したガジェットが色々出てきていますが、そういった特殊なガジェットではなく、もっと身近なデバイスと自分の手自身がインタラクションする様子を拡張して VR 内で表示できないか考えてみました。

例えばボタンを大量に有するインターフェースで、どこを押せば良いのかオーバーレイで教えてあげたり、押すと何が起こるのか情報を出してあげたり、押した結果を可視化して表示してあげたり出来ると、そのインターフェースに対しての習熟が早まる可能性があると思います。特に楽器とかでは効果がありそうで、音ゲーのような雰囲気で実際の楽器の演奏練習が出来る、みたいなことが出来ると面白そうです。

こういったインターフェースを操作する際、自分の手をそのまま使うことが多いと思います。ただその手を VR 内で表示するために、例えば Leap Motion のようなデバイスでトラッキングすると、たとえ精度が良くても誤作動に悩まされたり位置合わせが大変だったりして、没入感が損なわれやすいと考えています。色々とデバイスを試しましたが、VR 内で自分の手と認識するのは、やはりカメラスルーが一番良いと個人的には思います。

前置きが長くなりましたが、結論としてはちょっと工夫すれば簡単な仕組みで良い感じにインタラクションするデモを作ることが出来ます。そのサンプルとして、(パソコンの)キーボードを使った簡単なタイピングゲームっぽいデモを作ってみました。本エントリでは、その紹介と、仕組みの解説をしたいと思います。

デモ

飛んでくる単語のアルファベットを、自分の手で普段叩いているようにキーボードを叩いて入力し、Enter キーを押せば、そのキーの位置から弾が発射されて単語を壊せます。打鍵中に打鍵したキーでエフェクトを出したり、現在打つべき単語に関連するキートップを光らせたり、次に打つべきキーに矢印を出したりしています。

やりたかったことは、実際のデバイスに情報をオーバーレイすることでより使いやすくなるか、エフェクトでフィードバックすることで入力の補助となるか、といったことを調べることです。が、ぶっちゃけ普段キーボード見ないで打ってるのであまり使いやすくなるとかはなかったです(白目)、フィードバックがあるのはスゴイ楽しいですね。

VRScout でも紹介してもらいました。

コード

雑に作ったので再利用効かないですが何かのご参考になれば。

システム

キモはカメラスルーで表示するだけで手それ自身はトラッキングせずに、入力した結果のみをトラッキングすることです。

手の表示

カメラは Ovrvision Pro を使っていて、その機能の一つの HandMask を利用しています。HandMask はクロマキーと同じ仕組みで肌の色だけを選択的に抜いて表示する機能です。以前、Ovrvision Pro の解説記事でも触れました。

これで手を表示すると、面白いことにオクルージョンがそのまま再現されます。実際のデバイスの後ろに手が行くと手が隠れるので、当たり前といえば当たり前なのですが、通常はこのオクルージョンの処理を行うために色々とやるので便利です。

キーボードの表示

実はキーボードは現実の世界のものをカメラで表示しているわけではなく、サイズを計測しながらピッタリ合うモデル(HHKB Pro 2)を作成して、そのモデルを描画しています。

f:id:hecomi:20160219234236p:plain

VR の世界ではキー入力を受け取って、このモデルのキーを上下させています。

位置合わせ

AR マーカにオフセットを与えてキーボードの位置を固定位置で決め、そこにキーボードをぴったり置く、という形で位置合わせしています。マーカは Ovrvision SDK の AR のところの仕組みをちょっといじって、ArUco Board っぽいものを作成してトラッキングしています。本当は Constellation API や Lighthouse のような仕組みでトラッキングする方が良いと思うのですが未だないので。。

f:id:hecomi:20160220002042j:plain

こうしてキーボードの位置がぴったり合えば、あとはそれぞれのキーの位置もそのまま分かるのでエフェクト乗せ放題、というわけです。

画作り

画面は簡単にですがサイバーっぽくしています。これには意図があって、カメラスルーで表示している手がリアルだと周囲との一体感がなくて、逆に没入感が無くなってしまう感じがしたからです。むしろ線画でも没入感があるのは以前実験しています。

本デモでは周りは消していますが、周りを表示しても結構面白いです。

その他思いつくネタ

インタラクションするものが別に手でなくても応用できると思います。例えばドラムのバチを緑色で塗っておいて、バチは単にカメラシースルーで表示、シンバルやドラム、タムが叩かれたことだけを何らかのデバイスでトラッキングしてエフェクトを出す、みたいなものでも同じ感じでできると思います(私はドラム出来ませんが...)。

AR だと静止しているものではそこそこうまく行きますが、動いているものだと難しいので、そのあたりは Constellation API、Lighthouse に期待です。Rock Band VR もそんな感じになったらイイなぁ(ギター弾けないですが...)。

マウスくらいならマウス移動量を実際の世界の移動量に変換する関数を書けばトラッキング出来そうです。持ち上げたらずれちゃいますが...。

ちょっと面白そうだな、と思うのはタブレットですね。画面に AR マーカを表示しておいてタッチイベントを PC 側に飛ばすようにしておけば、自分の手指が見えつつ、色々な場所に動かしつつ自由にタッチ可能な板を使ったデモができると思います。以前の記事で紹介した Second Sruface の VR 版や、GravitySketch の発展版みたいな形で、指先にフィードバックのある空中お絵描きも出来ますね。

先行事例

Canon の MREAL でも同じように手を表示しつつ遮蔽も実現したソリューションを提供しています。

こちらは実際にはないものを空間に表示する事例のため、遮蔽を実現するためにステレオマッチングで深度情報を計算しています。

今後の展望

HTC Vive に搭載されているパススルーカメラ x Lighthouse の組み合わせがかなり有望な気がします。

おわりに

理想的にはシースルーメガネなデバイスで出来たほうが良いと思うのですが、まだテクノロジー的にそこまでのものはないので、しばらくはヘッドマウントなデバイス + カメラな構成になると思います。

ただ現状でも色々アイディアも思いつきますし、結構実用的だと思います。実装難易度もそれほど高くないので是非みなさんも試してみてください。