※この記事はOculus Rift Advent Calendar 2014の3日目です。
2日目の記事:
まっつんさん@n_mattun
OculusでPS3コントローラのSIXAXISと振動機能を使う方法
初めての方ははじめまして、ご存知の方はご無沙汰しております。最近拙作のSphericalImageCamをご利用いただいている方もおられるようで、ありがとうございます。今後もいろいろ機能を追加して行きたいと思いますので、よろしくお願いいたします。
今回はこのAssetの目玉である、全球画像を作る仕組みについて少しばかりお話をさせていただきたいと思います。全球画像は、Oculusをはじめとして、ハコスコや他のHMDと相性のいいものなので、どんどん流行っていってほしいと思っています。
直交座標系と極座標系の変換
Unity上では普通のレンダリングソフトと同様に、正射影変換と、透視(パースペクティブ)変換があるため、一般的な使用についてはあまり問題は発生しないと思います。しかし、特殊カメラについては機能としては無く、パノラマ撮影系のアセット(例1、例2、例3)があるように、広い意味でVR系に応用が利きそうなアセットがあまり多くありません。そこで拙作のSphericalImageCamですが、DLLを必要とせずに、ほぼUnityのスクリプトとシェーダで製作することができました。
さて、まず全球画像(Equirectangular projection)ですが、これは画面座標に極座標系(Polar coordinate system)であり、対して正射影変換や透視変換は直交座標系(Orthogonal coordinate system)の画面座標となるので、座標系に直接の対応関係がありません。そのまま貼り付けるものならゆがみが生じます。そこで必要になるのが座標系の変換です。
水平方向での変換 直交座標系 > 極座標系
まず、元の画像は以下のようになります。左から直交座標系から見た画像サンプル、直交座標系からゆがみを見るためのチェスボードパターン、極座標系からゆがみを見るためのグリッド、極座標系から見た画像サンプルになります。初期段階ではUnityからレンダリングした画像なので、直交座標系ではゆがみが無く、極座標系ではゆがみが発生しています。
Unityのカメラから得られる映像はすべて直交座標系なので、これを極座標系に変換します。極座標系の特徴は、原点からのキョリと角度で表され、同じキョリであれば、横の位置と縦の位置はそれぞれ従属しており、r^2=x^2+y^2の関係を持ちます。このため、まずはキョリをそろえる変換が必要になります。キョリをそろえた場合、以下のような画像になります。
直交座標系では分かりやすいゆがみが発生し、極座標系ではゆがみが収まっています。ただ、まだ横の方向では縦方向に伸びており、従属性を再現できていません。魚眼の場合は縦方向と横方向に従属性をかける必要があり、この従属性をかけた状態が樽型ゆがみになります。全球画像では横の位置は縦方向の位置に従属しませんが、縦の位置は横方向の位置に従属しており、縦と横で対象性が変わっています。
この従属性を再現して、ようやく全球画像の一部を取得することができます。SphericalImageCamでは水平方向にそれぞれ120度の視野角を持つカメラを3つ配置しており、これらを並べるてステッチすることでパノラマ画像を得ることができます。
さて、残りの上下ですが、これは少し変換に癖があるため、変わった方法を採用しました。
上下での変換 直交座標系 > 特殊な極座標系
一番上と一番下の位置の扱いは特殊で、北極点と南極点と同様に特異点になっています。このため、さっきの直交座標系から変換するときに異なる発想が必要になります。イメージとしては円の中心から放射状の面を、長方形に直すという感じです。元の画像は左から直交座標系でのチェスボードパターン、極座標系でのグリッド、位置関係を分かりやすくしたダートボードになります。これに特殊な変換を加えます。
中心からのキョリをそろえるための変換、そして中心座標を画面下にした変換をかけます。一部で不要な部分が混ざっていますが、実際にはトリミングが行われます。
上下のカメラから得られた全球画像はこのように配置されます。
このようにして、カメラから上下位置の360度方向の映像を得ることができます。
あとは最終的に全部の映像を合成すると、
このように、完全な全球画像をUnity上で再現することができます。
おわりに
Oculusクラスタでも、全球画像をベースにコンテンツを作られている方はあまり多くなく、実写はともかく、3DCGから全球動画を起こしているものは、積木製作様のコンテンツぐらいしか見たことがなく、マイナーであるという印象なのですが、今後カジュアルVRが出たときに、いろんなデバイスで再生しやすい全球動画はトリガーになりやすいと思っております。
全球動画に関していろいろチャレンジしていますので、興味を持っていただいたら、ぜひともチャレンジしていただければうれしいです。
明日(12/04)はシモダジュンヤさん@junyash の 「Oculus向けのコンテンツをUE4で制作するためのノウハウ共有(Oculus向けの最適化とか品質向上とか)」 の予定です。