どうして ?
なぜなら、カメラは投影ビューを表しているからです。
しかし、3Dカメラ(仮想カメラ)の場合、世界ではなくカメラが動きます。この回答については後で詳しく説明しました。
数学的に理解する
投影ビューは空間内を移動し、向きを変更します。最初に気づくのは、画面上の希望する投影が視線方向によって変化しないことです。
このため、他のものを変換して目的の投影を取得します。
http://opengl.orgからの理解
カメラを移動するように見せるために、OpenGLアプリケーションはカメラ変換の逆でシーンを移動する必要があります。OpenGLに関しては、カメラはありません。より具体的には、カメラは常に目の空間座標(0、0、0)に配置されます
http://open.glからの理解
また、http://open.gl/transformationsのビューマトリックス部分から次の行を共有したい
カメラの変換をシミュレートするには、実際にその変換の逆で世界を変換する必要があります。例:カメラを上に移動する場合は、代わりにワールドを下に移動する必要があります。
視点で理解する
現実の世界では、「視点」と呼ばれる方法で物事を見ています。
遠近法とは、遠くにあるオブジェクトは、近くにあるオブジェクトよりも小さく見えるという概念です。遠近法はまた、まっすぐな道路の真ん中に座っている場合、実際には道路の境界が2本の収束線として見えることを意味します。
それが展望です。3Dプロジェクトでは視点が重要です。視点がなければ、3Dの世界は現実に見えません。
これは自然で明白に思えるかもしれませんが、コンピューターで3Dレンダリングを作成するとき、コンピューター画面(2Dサーフェス)で3Dワールドをシミュレートしようとしていることを考慮することが重要です。
コンピューター画面の後ろに実際の3Dシーンがあり、コンピューター画面の「ガラス」を通して見ていると想像してください。パースペクティブを使用して、あなたの目標は、画面のこの「ガラス」に「投影される」ものをレンダリングするコードを作成することです。唯一の注意点は、この3Dワールドは現実的ではないということです。これは、3Dワールドの数学的シミュレーションにすぎません。
そのため、3Dレンダリングを使用してシーンを3Dでシミュレートし、3Dシーンを画面の2Dサーフェスに投影する場合、このプロセスは透視投影と呼ばれます。
達成したいことを直感的に想像することから始めます。オブジェクトがビューアに近い場合、オブジェクトは大きく見える必要があります。オブジェクトがより遠くにある場合、より小さく見える必要があります。また、オブジェクトが視聴者から離れて直線で移動している場合は、遠くに移動するにつれて、オブジェクトを画面の中心に向かって収束させます。
視点を数学に変換する
次の図の図を見ながら、オブジェクトが3Dシーンに配置されていることを想像してください。3Dの世界では、オブジェクトの位置は、視点を原点とする3D座標系を指すxW、yW、zWとして記述できます。それは、画面の向こうの3Dシーンで、オブジェクトが実際に配置される場所です。
視聴者がスクリーン上でこのオブジェクトを見ると、3Dオブジェクトは、スクリーンの2D座標系(投影面)を参照するxPおよびyPとして記述される2D位置に「投影」されます。
これらの値を数式に入れるには、世界座標に3D座標系を使用します。x軸は右を指し、yは上を向き、画面内では正のz点を指します。3D原点は、視聴者の目の位置を指します。そのため、画面のガラスは、z軸に直交する(直角で)平面上にあります。z軸はzProjと呼びます。
次のように、ワールド位置xWとyWをzWで除算することにより、投影位置xPとyPを計算できます。
xP = K1 * xW / zW
yP = K2 * yW / zW
K1とK2は、投影面(ビューポート)のアスペクト比や広角視力の程度を考慮した目の「視野」などの幾何学的要因から得られる定数です。
この変換がどのように遠近感をシミュレートするかを見ることができます。目からの距離(zW)が増加すると、画面の側面に近いポイントが中心に向かって押し出されます。同時に、中心(0,0)に近いポイントは、目からの距離による影響がはるかに少なく、中心に近いままです。
このzによる除算は、有名な「遠近法の除算」です。
ここで、3Dシーン内のオブジェクトが一連の頂点として定義されていると考えてください。そのため、この種の変換をジオメトリのすべての頂点に適用することにより、オブジェクトが視点から離れると縮小することを効果的に保証します。
その他の重要なケース
- 3Dカメラ(仮想カメラ)の場合、世界の代わりにカメラが動きます。
3Dカメラの理解を深めるために、映画を撮影していると想像してください。撮影したいシーンを設定する必要があり、カメラが必要です。映像を取得するには、カメラを使用してシーンをローミングし、シーン内のオブジェクトをさまざまな角度と視点から撮影します。
3Dカメラでも同じ撮影プロセスが発生します。作成した「仮想」シーンを動き回れる「仮想」カメラが必要です。
2つの人気のある撮影スタイルには、キャラクターの目を通して世界を見る(1人称カメラとも呼ばれます)か、カメラをキャラクターに向けて視界を維持する(3人称カメラ)ことが含まれます。
これは、3Dカメラの基本的な前提です。3Dシーンを動き回って、特定の視点から映像をレンダリングするために使用できる仮想カメラです。
ワールド空間とビュー空間を理解する
このような動作をコーディングするには、3Dワールドのコンテンツを、ワールド座標系の視点だけでなく、他の固定視点からでも、カメラの視点からレンダリングします。
一般的に、3Dシーンには3Dモデルのセットが含まれます。モデルは一連の頂点と三角形として定義され、独自の座標系を参照します。モデルが定義されている空間は、モデル(またはローカル)空間と呼ばれます。
モデルオブジェクトを3Dシーンに配置した後、「ワールド変換」マトリックスを使用してこれらのモデルの頂点を変換します。各オブジェクトには、ワールド内のオブジェクトの位置と向きを定義する独自のワールドマトリックスがあります。
この新しい参照システムは「ワールド空間」(またはグローバル空間)と呼ばれ、それを管理する簡単な方法は、ワールド変換マトリックスを各オブジェクトに関連付けることです。
3Dカメラの動作を実装するには、追加の手順を実行する必要があります。ワールドの原点ではなく、ワールドを参照しますが、3Dカメラ自体のリファレンスシステムを参照します。
適切な戦略には、カメラを3Dの世界の実際の3Dオブジェクトとして扱うことが含まれます。他の3Dオブジェクトと同様に、「ワールド変換」マトリックスを使用して、カメラを3Dワールドの目的の位置と方向に配置します。このカメラワールド変換行列は、カメラオブジェクトを元の(z軸に沿った)前方から実際の世界(xc、yc、zc)位置、および世界の回転に変換します。
次の図は、ワールド(x、y、z)座標系とビュー(カメラ)(x '、y'、z ')座標系との関係を示しています。