文書の過去の版を表示しています。
目次
VR
SDK
- Oculus SDK: https://developer.oculus.com/
- OSVR : http://osvr.github.io/
- NVIDIA VRWorks SDK
- SLI, Time warp, Direct mode 他
- AMD LiquidVR SDK
- Multi GPU, Latest data latch, Direct mode 他
VR と GPU 性能
VR Unit は CPU/GPU にかなり高いスペックを要求します。
- より高解像な display
- 視野角が広いためより高い解像度が望ましい
- ステレオ 2画面分のレンダリング
- 両目分 2回描画が必要。GPU の負担が大きい
- レンズに合わせたディストーション変換で低下する解像度を補うためのより大きなフレームバッファ
- 中央部の解像度低下を補うには、Display Size よりも高い解像度が必要。1.5倍程度。
- 高フレームレート
- トラッキングから描画までのレイテンシは VR 酔に繋がるため、90fps 以上の高いフレームレートが必要
- ただし reprojection (timewarp/spacewarp) 等によって擬似的なフレームレートを上げることが可能
- 処理落ちが許されない安定性
- 処理落ちはレイテンシを増やし VR 酔いに繋がるため一定のフレームレートを維持する必要あり。描画性能には十分かつ余裕が必要。
- なおフレーム補間(予測)により制限は緩和しつつあり
API とレンダリング
API
Oculus VR (ovr) 、SteamVR/OpenVR (openvr) 、 OpenSource VR (osvr) 名前が似ていますがいずれも互換性はありません。
Camera
(1) Game Camera Position | アプリケーションでコントロールする Camera 位置。アプリケーションが読み書きするのはここ。 |
(2) HMD Tracking Position | Head Tracking の結果を反映させるノード、(1) の直下に置かれる。レンダリング直前に反映させる必要あり |
(3) Eye Position | 目の位置。(2) から IPD/2 分左右にずらした場所。レンダリングに使うカメラはこれ |
- IPD = Interpupillary distance、目の間隔、だいたい 64mm 前後
(2) は Device によって決まる。 IPD はユーザーが設定するが API で値を保持している。 よって (2) と (3) は通常は API から求めることができる。 画角も Device 固定。 (2)/(3) は入力からレンダリング出力まで可能なかぎり低遅延であることが求められる。
Position Tracking 座標系
Device 毎に独自。 HTC Vive の RoomScale はシステム側で独自のキャリブレーション原点を持っている。 セットアップ時にユーザーが指定する。
その他のデバイスはアプリケーション側で必要に応じてキャリブレーション (HMD Position Reset/Recenter) 処理を行う。
HTC Vive : Room Scale
設置場所の移動可能な空間とゲーム内の空間が一致する。 キャリブレーション時に設定した原点が Tracking の基準点(地面)となる。 明確な地面の概念がある。 安全に移動可能な範囲をオーバーラップ表示したり、処理落ちを検出してシステム描画に切り替わるなど、Room Scale ならではの工夫が施されている。
その他の device
Game 内でコントロールしている Cemara 位置を Tracking の原点とみなすように調整が行われている。
HMD Position Reset (キャリブレーション) はアプリケーション依存。 ユーザーが任意のタイミングで実行可能なものも多い。 リセット時の基準位置を Game 内の Cmaera 位置とみなす。
実空間との同期はなく相対的なもの。 特にキャリブレーションされた地面の概念は無い。 座ってプレイすることが推奨される場合が多い。
その他の device の Room Scale
Tracking 可能な Camera (Sensor) 範囲に注意すれば、HTC Vive と同じように Room Scale に近い広い空間を移動することは可能。 地面位置のキャリブレーションは標準では提供されないので、アプリケーション側で行う必要あり。Oculus は Floor を基準に設定できる。 移動時に HTC Vive のようなシステム側のサポートがないので注意が必要。 移動可能範囲の表示が無かったり、処理落ち時に描画更新が遅れると平衡感覚が失われる可能性がある。
非 Realtime Rendering
プリレンダリングムービーや静止画による表現には限界があります。
- Position Tracking は Realtime でないと実現できない
- IPD はデバイス毎にユーザーが設定可能なパラメータなので一定にならない
IPD のずれはスケール感を狂わせる原因となります。 現状ではできるだけリアルタイムに描画することが望ましいといえます。
IPD とスケール感
IPD には、デバイス IPD とレンダリング IPD があります。
- デバイス IPD : 内蔵のディスプレイ&レンズ間の距離
- レンダリング IPD : レンダリング時の左右のカメラ間の距離
眼と眼の距離には個人差があるので、デバイス IPD 及びレンダリング IPD は変更できることが望ましいといえます。 デバイス IPD はレンズの位置なので、目の位置がレンズの一定範囲内におさまらなければ見えなくなってしまいます。
レンダリング IPD の場合、本来の目の幅に一致しなければ見えている物体のスケール感が狂います。 レンダリング IPD が小さい場合、視差が小さくなるため周囲の物体が遠くにあると錯覚し、大きく見えます。 レンダリング IPD が大きい場合、視差が大きくなるため周囲の物体が近くにあると錯覚し、小さく見えます。
プリレンダや 360度撮影動画などは、レンダリング IPD が固定されてしまうためスケールが狂いやすくなります。 特に視差がない 360度映像は、非常に大きな物体が動いているように見えてしまいます。
VR と MR
AR は現実の画像に CG を合成しますが、物体の奥行きまでは判断できません。例えば建物の陰に隠れることが出来ません。
MR は空間を認識して現実のオブジェクトに接地したり陰や裏側に回ることが出来ます。AR との大きな違いは Depth mapping です。
MR と視野角
MS Hololens のように透過型のディスプレイを使って CG 合成する場合は視野角が問題になります。
VR デバイスはレンズによってスクリーンを引き伸ばして大きな視野角を作り出しています。 例えば Oculus Rift CV1 や HTC Vive は 110度ありますが、その代わりにレンズの歪みを考慮して予め表示画像を逆補正しておかなければなりません。
透過型のディスプレイにレンズを使うと現実の空間が歪んでしまいます。逆補正できないので引き伸ばすことが出来ません。 そのため透過型の MR デバイスは表示できる領域が非常に小さく、窓のように切り取られた形になってしまいます。 Hololens はわずか 30度です。
外部カメラを使い VR HMD に表示すれば視野角の問題はなくなりますが遅延はありますしデバイスも大掛かりになります。