凹みTips

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

Oculus Rift でミクさんに画面の中から出てきていただいた:解説


はじめに

前回(PS Eye × 2個 を Unity 上で Oculus SDK と共に使ってみた - 凹みTips)は、PS Eye から取得したピクセルデータをテクスチャ化することが出来たので、今回はこれを利用して AR との組み合わせに挑戦してみました。

デモ動画

完成したデモはニコニコ動画へ上げてあります。

コメント / マイリスありがとうございます m(_ _)m

仕組み解説

言葉で書くとわかりにくいと思うので図解しました。

Unity では、2 つのカメラ入力それぞれに対して認識を同時に走らせて、それぞれのマーカの上に異なるミクさんを描画、それをレイヤマスクで左目には左目用のみ、右目には右目用のみ見えるようにしています。

利用ツール解説

AR

Unity で AR 系といったら QualcommVuforia か、String Labs の String かな、と思っていたのですが、どちらもモバイル用で exe 吐き出しが出来なかったため諦めました。代わりに、NyARToolkit for Unity を見つけたのでこちらを利用させて頂きました。

マーカレスではないのですが、exe 吐き出しも可能で Unity 関連部分のコード量も少なく改造も簡単そうだったのが決め手です。

画面から出てくるマスクについて

画面から出てくる雰囲気を出したかったので、あるレイヤよりも後ろにいる場合は描画しないというマスクを利用したく思い調べてみて以下のシェーダを見つけました。

これを適用したプレーンをモニタ位置に重なるように置いて、モニタから出てくる感じを表現しています。

コード解説

前回の PS Eye のテクスチャ取得部分の改造

前回のエントリでは、Script をアタッチしたオブジェクトの material を置き換えるものでしたが、テクスチャ単体で取り出せるようにしました。

また、NyARToolKit では WebCamTexture を利用しているようだったので、認識で使用している WebCamTexture の API をエミュレートするためのメンバをいくつか追加しました。

認識処理部分の改造

WebCamTexture を使わないようにして処理を全面的に書き換えています。マーカ認識は 2 つパラで走らせないとならないため、普通に走らせると処理が重いことからフレームレートが低下してしまったため、スレッドを分けました。また、まじめにマーカ位置に AR オブジェクトを表示すると認識誤差でバタついてしまうので、transform にはフィルタをかませています。

動きの同期

カメラの方を向かせる処理を書いたのですが、両方それぞれがカメラの方を向いてしまうと回転量の差が発生してしまうので、左目用のミクさんだけカメラの方を向かせて、右目用のミクさんはその首の傾きにシンクするみたいな細かい処理も行なっています。

既知の問題点 / 今後の展望

物理演算同期しない問題

物理演算に関しては左目用、右目用のミクさんの間で同期が取れず、仕方なく OFF にしています。左のミクさんに右のミクさんの Transform 全部同期させようかと思ったのですが辛そうなのでやめました。。

マーカ を見失った時の処理

本当はマーカを見失っても、Oculus Rift のジャイロを利用してある程度追従してくれるようにしたかったのですが、座標変換が難しくてやめました。前回のエントリのようなビルボード方式で、現実で自分の向いている方向と Unity の世界のカメラの方向が同期していればうまいこと計算できそうな気もするのですが、今回は NyARToolkit に則って、Unity の世界のカメラ位置・カメラテクスチャを貼り付けるプレーンの位置は固定しています。

何かうまい方法ご存知でしたら教えてください。

正面から見ると向きが別れてしまう問題

AR は正面が弱いらしいので、真正面から見ると左のミクさんは左を、右のミクさんを右を向いた形になってしまいます。つまり真正面に向くということがなくて、常にどちらかを向いている感じになってしまっています。向きの乖離が大きくなったら中間に寄せるとか無理やり出来ないこともないですが…。

追従速度

PSEye の解像度が良くないのもあると思うのですが、やっぱり追従性が悪くないので左右のズレが生じてしまったりガクガクしたりしてしまいます。

ライティング

ここまで踏み込むと研究になってしまいそうで出来ないですが、例えば白い半球を置き、そこに映る影を見て光の方向/明るさを調べて、AR オブジェクトに反映できたりするとリアル感増しそうですね。

オクルージョンの再現

AR オブジェクトに触れようと手を伸ばすと、かならず AR オブジェクトが前面に描画されてしまいます。これを物体よりも手前に手がある時は手を描画するようにするためには、クロマキーを使ったりデプスと組み合わせたりすることが必要になります。前者に関しては AR オブジェクトと同じ形をした現実の物体マーカーを用意することが必要になって、プリミティブな形状のものしか再現できなそうです。後者に関しては、頭に Kinect を積むのは辛いですが、せっかくステレオカメラで撮った視差のある画像があるため、OpenCV のステレオマッチング機能を使えばうまくいくかもしれません。

開発項目として上げておきたいと思います。

先行事例 / 関連技術調査

まだあると思いますが調べた先行事例や技術調査です。

Wizapply さんの Oculus Rift 用ステレオカメラ


2013/8/4 開催の http://ocufes.jp/ にも展示されていました。私は体験させて頂き損ねてしまったのですが、この動画並みの認識が出来ると色々出来そうで面白そうです。

meta: Thes Most Advanced Augmented Reality Glasses


今回の内容はコンセプト的にはシースルーな AR に近いものがあります。meta は kickstarter で出ていたプロジェクトですが視野角が 23°程なので、Oculus Rift + StereoAR の方が臨場感はある気がします。
既成品としては EPSON の MOVERIO があります。

もうすぐ AR 演劇の実証実験もするみたいです:

キヤノン MREAL


キヤノンはビジネス用に HMD を展開しており、MR(Mixed Reality)システムとして MREAL というソリューションを提供しています。その HMD の HM-A1 は解像度は 1280x960、対角 50° のようです(Oculus は 1280x800、対角110° ですが単純比較は出来ません(コメント欄参照))。
動画や仕様を見ると、高くて買えない OptiTrack などのモーションキャプチャシステムとマーカを組み合わせて定位や操作をしているようです。
また、SIGGRAPH 2013 でも展示していたようで、手の位置関係によって AR 物体のオクルージョンも表現しているようです。

これやりたい…。実際に燃え上がるなどのエフェクトを加えた古典芸能の展示などもあったようです(上記 Youtube)。

おわりに

多くの方に見ていただけたようで嬉しいです。AR そのもののアルゴリズム部分に足を踏み入れると帰ってこれなくなりそうですが、こういったものであれば既存のものの組み合わせで色々出来ると思います。何かアイディアや要望などありましたら是非リクエスト下さい。