Microsoft DirectX 8.0 (C++) |
ビュー トランスフォームとは、ワールド空間に視点を配置し、頂点をカメラ空間にトランスフォームする処理である。カメラ空間では、カメラ (つまり視点) は原点にあり、z 軸の正方向を向く。Microsoft® Direct3D® では左手座標系を使用するため、z はシーンの正方向を向く。ビュー行列は、ワールド内のオブジェクトをカメラの位置 (カメラ空間の原点) と向きの周囲に再配置する。
ビュー行列は多くの方法で作成できる。すべての方法において、カメラはワールド空間内でいくつかの論理位置座標と向きを持つ。これらの位置座標と方向は、シーン内のモデルに適用するビュー行列を作成する際の始点となる。ビュー行列は、オブジェクトを平行移動および回転して、カメラを原点としたカメラ空間内に位置座標付ける。ビュー行列を作成する方法としては、平行移動行列と各軸に対する回転行列を組み合わせる方法がある。この方法では、次の一般的な行列式が適用される。
この式では、V は作成するビュー行列、T はオブジェクトをワールド内に再配置する平行移動行列、Rx 〜 Rz は x、y、および z 軸に沿ってオブジェクトを回転する回転行列である。この平行移動行列と回転行列は、ワールド空間におけるカメラの論理位置座標と向きに基づいている。したがって、ワールドにおいてカメラの論理位置座標が <10,20,100> の場合、平行移動行列は、x 軸に沿って -10 単位、y 軸に沿って -20 単位、z 軸に沿って -100 単位だけオブジェクトを平行移動することになる。この式における回転行列は、カメラの向きに基づいており、カメラ空間の軸がワールド空間からどれくらい回転するかを表す。たとえば、上の例のカメラが真下を向いている場合、次の図に示すように、カメラ空間の z 軸はワールド空間の z 軸から 90° (π/2 ラジアン) だけずれている。
回転行列は、マグニチュードは同じであるが方向が逆の回転を、シーン内のモデルに適用する。このカメラに対するビュー行列は、x 軸を中心とした -90°の回転を含む。回転行列と平行移動行列を組み合わせることで、シーン内のオブジェクトの位置座標と向きを調整するビュー行列を作成して、オブジェクトの上側にカメラを置いてモデルを上から見下ろすことができる。
別の方法として、複雑なビュー行列を直接作成する方法もある。D3DXMatrixLookAtLH および D3DXMatrixLookAtRH ヘルパー関数では、この手法が使用される。この方法では、カメラのワールド空間における位置座標とシーン内の注視点を使用して、カメラ空間の座標軸の向きを記述するベクトルを派生させる。注視点からカメラ位置座標を減算して、カメラの方向ベクトル (ベクトル n) 用のベクトルを生成する。次に、ベクトル n とワールド空間の y 軸の外積をとり、正規化して、右方向ベクトル (ベクトル u) を生成する。次に、ベクトル u と n の外積をとり、上方向ベクトル (ベクトル v) を決める。右方向 (u)、上方向 (v)、およびビュー方向 (n) のベクトルは、ワールド空間におけるカメラ空間の座標軸の向きを記述する。x、y、z の平行移動係数は、カメラ位置座標と u、v、n ベクトルの間の内積の負数をとって計算する。
これらの値を次の行列に入れて、ビュー行列を生成する。
この行列では、u、v、n はそれぞれ上方向、右方向、ビュー方向のベクトルであり、c はカメラのワールド空間位置座標である。この行列には、ワールド空間をカメラ空間に平行移動と回転するために必要な要素がすべて格納される。この行列を作成した後、z 軸を中心とする回転行列を作成して、カメラを回転することができる。
この方法の実装については、「ビュー行列の設定」を参照すること。