2009-03-29 10 views

答えて

12

世界とカメラの変換行列は、カメラとワールドの行列の逆行列です。カメラからワールドへのマトリックスは、カメラの位置への平行移動とカメラの向きへの回転の組み合わせです。 Mは、カメラの向きとトンに対応する3x3の回転行列であればこのように、カメラの位置は、その後、4×4のカメラ・ツー・世界行列は次のようになります。私がいることを想定してきた

 
M00 M01 M02 tx 
M10 M11 M12 ty 
M20 M21 M22 tz 
0 0 0 1 

注意ベクトルは右側に乗算されて変換を実行する列ベクトルです。逆の規則を使用する場合は、必ず行列を転置してください。

Mを検索するには、ロール、ピッチ、ヨーなどの特定の規則に応じて、Wikipediaに記載されている式のいずれかを使用できます。これらの式では、ベクトルは左に乗算される行ベクトルであるという規則を使用しています。

カメラからワールドへの行列を計算して反転するのではなく、より効率的な(そして数値的に安定した)代わりの方法は、ワールド・ツー・カメラ行列を直接計算することです。これを行うには、(3つの座標すべてを無効にする)カメラの位置とその向きを反転させます(ロール、ピッチ、ヨー角を無効にし、それらを適切な範囲に調整する)。アルゴリズム。

-5

あなたは何を記述しているかは「パースペクティブ投影法」と呼ばれ、マトリクスの数学を説明し、これを行うために必要なコードをウェブ上に提供しています。我々は4x4の行列記述するために、このような構造を持っている場合は、wikipedia page

7

で始めることができます:あなたが持っているすべてのオイラー角の場合

class Matrix4x4 
{ 
public: 
    union 
    { 
     struct 
     { 
      Type Xx, Xy, Xz, Xw; 
      Type Yx, Yy, Yz, Yw; 
      Type Zx, Zy, Zz, Zw; 
      Type Wx, Wy, Wz, Ww; 
     }; 

     struct 
     { 
      Vector3<Type> Right; 
      Type XW; 
      Vector3<Type> Up; 
      Type YW; 
      Vector3<Type> Look; 
      Type ZW; 
      Vector3<Type> Pos; 
      Type WW; 
     }; 

     Type asDoubleArray[4][4]; 
     Type asArray[16]; 
    }; 
}; 

を、それはヨー、ピッチ、ロールを表す角度であります3D空間内の点の位置を指定すると、Right、Up、およびLookベクトルを計算できます。 Right、Up、LookはX、Y、Zのベクトルですが、これはカメラなので簡単に名前を付けることができます。ローテーションをカメラ行列に適用する最も簡単な方法は、一連の回転行列を作成し、各回転行列でカメラ行列を掛けることです。そのため

良いの参照はここにある:http://www.euclideanspace.com

あなたはすべての必要な回転を適用したら、あなたはワールド空間でのカメラの位置にベクトル順位を設定することができます。

最後に、カメラの変換を適用する前に、カメラの行列の逆行列を取る必要があります。これは、ポリゴンの描画を開始する前に、モデルビュー行列を掛けることになります。上記の行列クラスの場合、逆は、このように計算されます。

Matrix4x4<float> cameraMatrix, rollRotation, pitchRotation, yawRotation; 
Vector4<float> cameraPosition; 

cameraMatrix = cameraMatrix * rollRotation * pitchRotation * yawRotation; 

Matrix4x4<float> invCameraMat; 

invCameraMat = cameraMatrix.OrthoNormalInverse(); 

glMultMatrixf(invCameraMat.asArray); 

・ホープ、この:

template <typename Type> 
Matrix4x4<Type> Matrix4x4<Type>::OrthoNormalInverse(void) 
{ 
    Matrix4x4<Type> OrthInv; 
    OrthInv = Transpose(); 
    OrthInv.Xw = 0; 
    OrthInv.Yw = 0; 
    OrthInv.Zw = 0; 
    OrthInv.Wx = -(Right*Pos); 
    OrthInv.Wy = -(Up*Pos); 
    OrthInv.Wz = -(Look*Pos); 
    return OrthInv; 
} 

だから最終的には、道のうち、すべての私たちの行列constuctionで、あなたはこのような何かをやっているだろう助けてください。

関連する問題