Platform SDK: DirectX

ビュー トランスフォームとは

ビュー トランスフォームとは、ワールド空間に視点を配置し、頂点をカメラ空間にトランスフォームする処理である。カメラ空間では、カメラ (つまり "視点") は原点にあり、z 軸の正方向を向く (Direct3D では左手座標系を使用するため、z はシーンの正方向を向く)。ビュー行列は、ワールド内のオブジェクトを、カメラの位置座標 (カメラ空間の原点) と方向の周囲に再配置する。

ビュー行列は多くの方法で作成できる。すべての方法において、カメラはワールド空間内でいくつかの論理位置座標と方向を持つ。これらの位置座標と方向は、シーン内のモデルに適用するビュー行列を作成する際の始点となる。ビュー行列は、オブジェクトを平行移動および回転して、カメラを原点としたカメラ空間内に位置座標付ける。ビュー行列を作成する方法としては、平行移動行列と各軸に対する回転行列を組み合わせる方法がある。この方法では、次の一般的な行列式が適用される。

この式では、V は作成するビュー行列、T はオブジェクトをワールド内に再配置する平行移動行列、RxRz は x、y、および z 軸に沿ってオブジェクトを回転する回転行列である。この平行移動行列と回転行列は、ワールド空間におけるカメラの論理位置座標と方向に基づいている。したがって、ワールドにおいてカメラの論理位置座標が <10,20,100> の場合、平行移動行列は、x 軸に沿って -10 単位、y 軸に沿って -20 単位、z 軸に沿って -100 単位だけオブジェクトを平行移動することになる。この式における回転行列は、カメラの向きに基づいており、カメラ空間の軸がワールド空間からどれくらい回転するかを表す。たとえば、上の例のカメラが真下を向いている場合、次の図に示すように、カメラ空間の z 軸はワールド空間の z 軸から 90°(π/2 ラジアン) だけずれている。

回転行列は、大きさは同じであるが方向が逆の回転を、シーン内のモデルに適用する。このカメラに対するビュー行列は、x 軸を中心とした -90°の回転を含む。回転行列と平行移動行列を組み合わせすることで、シーン内のオブジェクトの位置座標と方向を調整するビュー行列を作成して、オブジェクトの上側にカメラを置いてモデルを上から見下ろすことができる。

別の方法として、複雑なビュー行列を直接作成する方法もある (D3dutil.cpp ソース ファイルにある D3DUTIL_SetViewMatrix ヘルパー関数では、Visual Basic アプリケーションで使用する DirectX7.ViewMatrix メソッドと同様に、この方法を使用する)。この方法では、カメラのワールド空間における位置座標とシーン内の "注視点" を使用して、カメラ空間の座標軸の向きを記述するベクトルを派生させる。注視点からカメラ位置座標を減算して、カメラの方向ベクトル (ベクトル n) 用のベクトルを生成する。次に、ベクトル n とワールド空間の y 軸の外積をとり、正規化して、"右方向" ベクトル (ベクトル u) を生成する。次に、ベクトル u と n の外積をとり、"上方向" ベクトル (ベクトル v) を決める。右方向 (u)、上方向 (v)、およびビュー方向 (n) のベクトルは、ワールド空間におけるカメラ空間の座標軸の方向を記述する。x、y、z の平行移動係数は、カメラ位置座標と uvn ベクトルの間の内積の負数をとって計算する。

これらの値を次の行列に入れて、ビュー行列を生成する。

この行列では、uvn はそれぞれ上方向、右方向、ビュー方向のベクトルであり、c はカメラのワールド空間位置座標である。この行列には、ワールド空間をカメラ空間にトランスフォームと回転するために必要な要素がすべて格納される。この行列を作成した後、z 軸を中心とする回転行列を作成して、カメラを回転することができる。

この方法の実装については、「ビュー行列の設定」を参照すること。