注意! この記事はQiitaにて公開されていた内容をimportしたものです。
これらの内容は場合によっては陳腐化していて役に立たなくなっていたり、有害であったり、現在の著者の主張と異なることがあります。
皆様の判断の上でご利用いただけますと幸いです(度を超してヤバいものは著者に連絡して頂ければ対応します m(_ _)m)


はじめに

そんなわけで、リーマン生活での数少ない夏休みを使って、Cardboardで3D描画された図形を立体的に見てキャッキャしていました。

Screenshot_2014-08-26-16-10-36.png

本記事では、Cardboardで見ると立体的に見えるような映像をAndroidアプリで映し出す方法について雑に解説します。

Cardboardってなに?

Cardboardのサイトによりますと、

Virtual reality on your smartphone We want everyone to experience virtual reality in a simple, fun, and inexpensive way. That’s the goal of the Cardboard project. (link: Cardboard)

とのことで、ご家庭にあるスマートフォンでVRやろうぜ、みたいなやつです。

OculusRiftでは装置にディスプレイが一体となっており、PCなどから映像を送信することで、VRを体験することができます。 一方、Cardboardは装置がスマートフォンとVRビューワー(レンズとダンボールのやつ)で構成されており、ディスプレイ部分はスマートフォンを使うことになります。

VRビューワーはダンボールと凸レンズなどで構成されているため、競合プロダクトより安価であることがウリ(ではないかと俺は思っている)ですが、レンズの入手が割とめんどくさい感じです。

Cardboard互換のタオバイザーがクラウドファンディングによる支援を募っております。リターンとしてタオバイザーを届けてくれるようなので、気長に待つぜ!という人は支援してみても良いかも。

何が何でも今すぐに欲しい!という方は、割高感はありますがダングラスを購入すると良いでしょう(僕はダングラス買いました。。。)。

仕組み

恐らくは競合のVRプロダクトと同じだと思うのですが(Oculusの事情について僕は詳しくないです。。)、Cardboardでの映像投影で大雑把に以下の処理が施されております。

  1. 頭と目の位置を取得する(ヘッドトラッキング)
  2. 空間(3D空間や写真etc…)のレンダリング
  3. レンズの歪みの補正
  • Cardboardは凸レンズを使うので、普通に見ると像がずれるので、それを補正するために逆の歪みをつける
  1. ステレオ(サイドバイサイド)で描画

このうち、VR Toolkit(Cardboardのアプリを書くときに使うライブラリ)では2番以外の処理を勝手にやってくれます。なので、OpenGL ESの知識があれば簡単にVRアプリを書くことが出来るというわけです。

スクリーンショット 2014-08-20 19.14.07.png (Google I/O 2014 - Cardboard: VR for Android - YouTubeより引用)

アプリの開発

そもそも、以下のリンク先を読めばひと通り理解できると思います。しかも僕が説明するよりわかりやすい!

ただ、僕のようにCardboardからOpenGLプログラミングをやるようなタイプだと、OpenGLで挫けそうになります。 なので、ひと通りやってみた結果のソースコードをGitHubにて公開してありますので、動かしつつ感覚を掴んで頂ければ幸いです。

このGitHubプロジェクトでは、トーラスという図形を描画するサンプルになっています。しかしながらヘッドトラッキングも実装してあるので、立体的なものを適当に見るにはいい感じだと思います。 ただ、あまり立体的ではないですね。これは影がないからだと思います。なのでピクセルシェーダーを改良すればいい感じになる気はします。

まとめ

もうちょっと深くOpenGLとかに触れたいのですが、ここからはOpenGLの知識が必要となるため、ひとまずはCardboardの概要のみにとどめてあります。

また、CardboardのVR ToolkitはAndroidアプリだけではなくWebアプリとしても製作可能です。むしろそっちのほうがWebGL関連の資源が使えるので簡単に作れそうな気もします。

ともあれ、このガジェットは手軽にVRで遊ぶことができるのでオススメです。 そろそろ夏も終わりますが、自由研究にCardboard、いかがでしょうか。