ビュー変換 (Direct3D 9)
このセクションでは、ビュー変換の基本的な概念について説明し、Direct3D アプリケーションでビュー変換マトリックスを設定する方法について詳しく説明します。
ビュー変換では、ワールド空間内のビューアーが検索され、頂点がカメラ空間に変換されます。 カメラ空間では、カメラ (ビューアー) は原点にあり、正の z 方向を見ています。 Direct3D では左利きの座標系が使用されるため、z はシーンに正の値を使用することを思い出してください。 ビュー マトリックスは、カメラの位置 (カメラ空間の原点) と向きを中心に、世界中のオブジェクトを再配置します。
ビュー マトリックスを作成する方法は多数あります。 いずれの場合も、カメラはワールド空間で論理的な位置と向きを持ち、シーン内のモデルに適用されるビュー マトリックスを作成するための開始点として使用されます。 ビュー マトリックスは、オブジェクトを平行移動および回転して、カメラが原点にあるカメラ空間に配置します。 ビュー マトリックスを作成する 1 つの方法は、平行移動行列と各軸の回転行列を組み合わせることです。 この方法では、次の一般的な行列式が適用されます。
ビュー変換する
この数式では、V は作成されるビュー マトリックス、T はワールド内のオブジェクトの位置を変更する平行移動行列、Rz を通る Rₓ は、x 軸、y 軸、z 軸に沿ってオブジェクトを回転させる回転行列です。 平行移動行列と回転行列は、ワールド空間におけるカメラの論理的な位置と向きに基づいています。 したがって、カメラの世界における論理位置が 10,20,100><場合、平行移動行列の目的は、オブジェクトを x 軸に沿って -10 単位、-20 単位を y 軸に沿って移動し、z 軸に沿って -100 単位を移動することです。 数式内の回転行列は、カメラ空間の軸がワールド空間とのアライメントからどれだけ回転されるかという点で、カメラの向きに基づいています。 たとえば、前に説明したカメラが真下を向いている場合、次の図に示すように、z 軸はワールド空間の z 軸とのアライメントから 90 度 (pi/2 ラジアン) になります。
回転行列は、シーン内のモデルに等しいが反対の大きさの回転を適用します。 このカメラのビュー マトリックスには、x 軸を中心に -90 度の回転が含まれます。 回転行列を平行移動行列と組み合わせて、シーン内のオブジェクトの位置と向きを調整し、その上がカメラに向くようにビュー マトリックスを作成し、カメラがモデルの上に配置されるようにします。
ビュー マトリックスの設定
D3DXMatrixLookAtLH および D3DXMatrixLookAtRH ヘルパー関数は、カメラの位置とルックアット ポイントに基づいてビュー マトリックスを作成します。
次の例では、左側の座標のビュー マトリックスを作成します。
D3DXMATRIX out;
D3DXVECTOR3 eye(2,3,3);
D3DXVECTOR3 at(0,0,0);
D3DXVECTOR3 up(0,1,0);
D3DXMatrixLookAtLH(&out, &eye, &at, &up);
Direct3D では、ワールドとビューのマトリックスを使用して、いくつかの内部データ構造を構成します。 新しいワールドマトリックスまたはビューマトリックスを設定するたびに、関連する内部構造が再計算されます。 これらのマトリックスを頻繁に設定すると、計算に時間がかかります。 ワールド マトリックスとビュー マトリックスをワールド マトリックスとして設定したワールド ビュー マトリックスに連結し、ビュー マトリックスを ID に設定することで、必要な計算の数を最小限に抑えることができます。 個々のワールドのキャッシュされたコピーを保持し、必要に応じてワールド マトリックスを変更、連結、リセットできるマトリックスを表示します。 わかりやすくするために、サンプルでこの最適化が採用されることはほとんどありません。
関連トピック