ワールド変換 (Direct3D 9)
ワールド変換の説明では、基本的な概念を紹介し、ワールド変換を設定する方法の詳細を示します。
ワールド変換とは
ワールド変換では、座標がモデル空間から変更され、頂点はモデルのローカル原点を基準にして定義されます。ワールド空間では、シーン内のすべてのオブジェクトに共通する原点を基準に頂点が定義されます。 本質的に、世界の変革はモデルを世界に配置します。そのため、その名前。 次の図は、ワールド座標系とモデルのローカル座標系の関係を示しています。
ワールド変換には、平行移動、回転、スケーリングの任意の組み合わせを含めることができます。
ワールド マトリックスの設定
他の変換と同様に、一連の行列を 1 つの行列に連結し、効果の合計を含むワールド変換を作成します。 最も単純なケースでは、モデルがワールド原点にあり、そのローカル座標軸がワールド空間と同じ方向にある場合、ワールド 行列は ID 行列です。 より一般的には、ワールド 行列は、ワールド空間への平行移動と、必要に応じてモデルを回転させる 1 つ以上の回転の組み合わせです。
次の例では、C++ で記述された架空の 3D モデル クラスから、D3DX ユーティリティ ライブラリに含まれるヘルパー関数を使用して、モデルを向ける 3 つの回転と、ワールド空間での位置を基準にして再配置する平行移動を含むワールド マトリックスを作成します。
/*
* For the purposes of this example, the following variables
* are assumed to be valid and initialized.
*
* The m_xPos, m_yPos, m_zPos variables contain the model's
* location in world coordinates.
*
* The m_fPitch, m_fYaw, and m_fRoll variables are floats that
* contain the model's orientation in terms of pitch, yaw, and roll
* angles, in radians.
*/
void C3DModel::MakeWorldMatrix( D3DXMATRIX* pMatWorld )
{
D3DXMATRIX MatTemp; // Temp matrix for rotations.
D3DXMATRIX MatRot; // Final rotation matrix, applied to
// pMatWorld.
// Using the left-to-right order of matrix concatenation,
// apply the translation to the object's world position
// before applying the rotations.
D3DXMatrixTranslation(pMatWorld, m_xPos, m_yPos, m_zPos);
D3DXMatrixIdentity(&MatRot);
// Now, apply the orientation variables to the world matrix
if(m_fPitch || m_fYaw || m_fRoll) {
// Produce and combine the rotation matrices.
D3DXMatrixRotationX(&MatTemp, m_fPitch); // Pitch
D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
D3DXMatrixRotationY(&MatTemp, m_fYaw); // Yaw
D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
D3DXMatrixRotationZ(&MatTemp, m_fRoll); // Roll
D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
// Apply the rotation matrices to complete the world matrix.
D3DXMatrixMultiply(pMatWorld, &MatRot, pMatWorld);
}
}
ワールド マトリックスを準備したら、IDirect3DDevice9::SetTransform メソッドを呼び出して設定し、最初のパラメーターに D3DTS_WORLD マクロを指定します。
手記
Direct3D では、ワールドを使用し、いくつかの内部データ構造を構成するために設定したマトリックスを表示します。 新しいワールドマトリックスまたはビューマトリックスを設定するたびに、関連する内部構造が再計算されます。 これらのマトリックスを頻繁に設定する (たとえば、フレームあたり数千回) は、計算に時間がかかります。 ワールド マトリックスとビュー マトリックスをワールド マトリックスとして設定したワールド ビュー マトリックスに連結し、ビュー マトリックスを ID に設定することで、必要な計算の数を最小限に抑えることができます。 必要に応じてワールド マトリックスを変更、連結、リセットできるように、個々のワールドおよびビュー マトリックスのキャッシュされたコピーを保持します。 わかりやすくするために、このドキュメントの Direct3D サンプルでは、この最適化を採用することはめったにありません。
関連トピック