次の方法で共有


ビュー トランスフォーム

ビュー トランスフォーム

ここでは、ビュー トランスフォームの基本的な概念を紹介し、Microsoft® Direct3D® アプリケーションでビュー トランスフォーム行列を設定する方法について詳しく説明する。説明するトピックは、次のとおりである。

  • ビュー トランスフォームとは
  • ビュー行列の設定

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

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

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

ビュー トランスフォーム

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

ビュー空間 (view space)

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

ビュー行列の設定

D3DXMatrixLookAtLH および D3DXMatrixLookAtRH ヘルパー関数は、カメラ位置および注視点に基づいてビュー行列を作成する。

次のサンプル コードでは、右手座標系のビュー行列を作成している。

D3DXMATRIX out;
D3DXVECTOR3 eye(2,3,3);
D3DXVECTOR3 at(0,0,0);
D3DXVECTOR3 up(0,1,0);
D3DXMatrixLookAtRH(&out;, &eye;, &at;, &up;);

Direct3D では、設定されたワールド行列およびビュー行列を使って、いくつかの内部データ構造を構築する。新しいワールド行列またはビュー行列を設定するたびに、関係する内部構造が再計算される。これらの行列を頻繁に設定すると、計算に時間がかかる。必要な計算を最小限に抑えるには、ワールド行列とビュー行列を連結してワールドビュー行列を作成し、それをワールド行列として設定した後で、ビュー行列を単位行列に設定するとよい。ワールド行列およびビュー行列の各キャッシュ コピーは保持しておくこと。必要に応じてワールド行列を修正・連結・リセットできる。サンプルでは、簡潔であることを優先して、この最適化はほとんど用いていない。