4. ダイナミック立体視カメラの設定

先に定義した理論的なモデルを念頭におきつつ、芸術性や快適性や技術的な制約を解決する、モデルの制約を緩和したカメラ制御も可能です。

これから説明する機能を実装する場合に、ユーザーの目の位置を、ユーザーの絶対位置と目の相対位置とに分けて考えることとします。こうすることで、立体視効果とダイナミックパースペクティブ効果を独立して把握することが可能です。

立体視効果とダイナミックパースペクティブの分離のため、ユーザー位置としての目の中間位置と、そこからの相対位置としての目の位置とを使います。ユーザー位置はダイナミックパースペクティブ向けで、目の相対位置は立体視向けです。

図 4-1. ユーザー位置としての目の中間位置と目の位置の分離

ユーザー位置 目の中間位置

4.1. ワイド FOV

単一のカメラを扱う場合、ゲーム制作者が特定の FOV を使うのは自然なことです。一方で、理想的な立体視で必要な固定された FOV つまり標準的な FOV は、ユーザーが見るスクリーンの角度と一致しています。

たいていの場合、特定の FOV は標準的な FOV に比べて大きくなります。このような FOV を ワイド FOV と呼びます。

図 4-2. ワイド FOV カメラ

ワイド FOV カメラ

標準的な FOV に合致し、ウィンドウがベースカメラと合致する現実に即したカメラを使うことも可能です。しかし、芸術性の観点から異なる FOV が必要になるかもしれません。

もし ワイド FOV を使いたい場合、左右のカメラ距離をうまく設定することで、スクリーンの中心にあるオブジェクトのゆがみを低減することが可能です。左右カメラがウィンドウの中心点に向いている方向と、ユーザーがスクリーン中央を見ている方向とを合致させることで、このゆがみを最小限に抑えることができます。

図 4-3にあるように、理想的な立体視カメラのカメラ間距離と、ワイド FOV の左右のカメラ距離がウィンドウからの距離に比例するように配置することで、ゆがみを低減することができます。

図 4-3. ワイド FOV カメラの理想的なカメラ間距離

ワイドFOVカメラ 理想的なカメラ間距離

ダイナミックパースペクティブの場合、ユーザー位置を基にどのようにカメラ位置を計算すればよいのでしょうか。これには 2 つの手法が考えられます。

1 つ目は両目の距離を拡大縮小したように、動きを拡大縮小する方法です。この方法では、スクリーン中央のオブジェクトを適切な角度から見ることができます。しかし、遠くのオブジェクトの動きが小さくなります。

2 つ目はスケーリングせずに、カメラ画像から得られたユーザーの動きを再現することです。このモードでは遠方のオブジェクトは現実に即した動きをするように感じ、一方で前方のオブジェクトは回転したように、またはゆがんだように見えます。

どちらの手法も正しいと言えますが、描画シーンに応じて両者の中間的な振る舞いをさせるのが有効です。0 から 1 の値をとるスカラー係数 であるワイド FOV 動作係数を使って中間的な振る舞いを実現することが可能です。

図 4-4. FOV 動作係数 0 の場合

FOV 動作係数 0 FOV 動作係数 1

図 4-5. FOV 動作係数 1 の場合

4.2. 現実に即した FOV 係数

もし ワイド FOV 立体視カメラを理想的な立体視カメラにスムーズに変形したい場合は、両者を補間してみると興味深い動きをします。仮想カメラをある位置から別の位置に線形補間を使って動かすことになります。この線形補間の係数が現実に即した FOV 係数です。

図 4-6. 現実に即した FOV 係数

現実に即した FOV 係数 理想的な立体視カメラ

4.3. ダイナミックパースペクティブ振幅係数

ダイナミックパースペクティブ効果は係数をかけることで大きくも小さくもできます。この係数がダイナミックパースペクティブ振幅係数で、ユーザーの標準位置からの変位に相当します。

この振幅係数は意図する効果や固有の制約によって、 x と y とを独立して別々の値を適用することも可能です。

4.4. ダイナミックパースペクティブクランプ係数

ユーザーの顔が検出される領域はカメラの FOV により決まっています。ユーザーがこの領域の外に動けば、システムはユーザー位置がわからなくなります。これ以上動けば領域外に出るということをユーザーが見てわかるフィードバックとして返すため、最大視認角度を狭くクランプすることが可能です。

このクランプはカメラの視界となるボリューム制御にも使えます。

4.5. 傾きと立体カメラの改善

クランプ係数もしくは振幅係数を 0 に設定した場合、カメラの変位はなくなり、カメラは静的な立体視カメラのように見えるでしょう。

しかしながら、検出された目の位置を基にユーザーと本体の角度がわかるので、仮想カメラにこの傾きを適用することも可能です。ユーザーが車のハンドルのようにスクリーンを傾けた場合に、立体視の品質はさらに良くなるでしょう。

図 4-7. 静的な立体視カメラの改善

静的な立体視カメラ

非常にまれなケースですが、傾きを使おうとすると問題が起きる場合があります。仮想カメラの動きによっては不自然な画像が生成されることもありえます。この場合は傾きを無効にしてカメラを水平にして使うことになります。

4.6. 限界視差

ユーザーの快適性を維持するため、アプリケーション開発者は視差の限界距離を指定することができます。ファークリップ面にあるオブジェクトでもこの距離より視差がつくことがないように、カメラ間距離の最大値はこの制約で決まります。この制約はニアクリップ面のオブジェクトには強制されません。

4.7. 3D ボリュームと立体視係数

ユーザーが快適に 3D 効果をチューニングできるように、3D ボリュームによりカメラ間の距離を伸縮させる必要があります。開発者は 0 から 1 の値をとる立体視係数を提要することが可能です。この係数を 3D ボリュームの値と乗算することでカメラ間の距離を縮めることが可能です。必要に応じて立体視効果を低減させたり、2D から 3D へのスムーズな遷移が可能になります。