2012-04-10 6 views
2

私は転送する4x4行列の浮動小数点値をピギーバックしたいと思っています。問題の行列は、さまざまなxyzベクトル変換に使用されます。私が理解している限り、行列の最初の3x3は回転とスケールの変換を容易にし、最初の3行の4番目の値は変換のピボットをオフセットし、最後の行の最初の3つの要素は位置のオフセットを行いますが、要素ですか?私が見た限りでは、それは常に1であり、全く何もしません。4x4行列の最後の要素の重要度?

+0

どの施設/ツール/ API /など。あなたはこれを使っていますか?これは数学/行列の標準ではなく、あなたがこの行列も渡しているものの慣例です。 – RBarryYoung

+0

私の見解はスケーリングをコントロールしていると思います。 – RBarryYoung

+0

行列はd3dx関数を使用して作成され、hlsl環境で適用されますが、スケーリングも私の最初の考えでしたが、ランダムベクトルで100個のランダム行列を試して、最後の値を変更しても何もしませんでした –

答えて

8

ポイントが列ベクトルで、最初の3行の最後の要素が変換を決定するという規則がある場合、最下行の最初の3要素はではなく、位置オフセットです。変換行列の4番目の行は、カメラが3D点を2Dビューポートにマッピングする方法である透視投影に使用されます。 4×4行列をポイントをマッピングするために使用される方法のスケッチ:

result =  4x4 matrix  * point 

[ x' ]  [ Rxx Rxy Rxz Tx ]  [ x ] 
[ ]  [    ]  [ ]  -> R** is the rotation/scaling matrix 
[ y' ]  [ Ryx Ryy Ryz Ty ]  [ y ] 
[ ] = [    ] * [ ]   T* is the translation vector 
[ z' ]  [ Rzx Rzy Rzz Tz ]  [ z ] 
[ ]  [    ]  [ ]   P* fixes the camera projection plane 
[ w' ]  [ Px Py Pz Pw ]  [ w ] 

-> x' = dot_product3([Rxx,Rxy,Rxz], [x,y,z]) + Tx * w 
-> y' = dot_product3([Ryx,Ryy,Ryz], [x,y,z]) + Ty * w 
-> z' = dot_product3([Rzx,Rzy,Rzz], [x,y,z]) + Tz * w 
-> w' = dot_product4([Px,Py,Pz,Pw], [x,y,z,w]) 

最終3D点におけるステップ - > 2D画面マッピングが4(w')座標により分割することである - ので、標準的な幾何学的変換のために最後の行は通常[0,0,0,1]であり、wの座標は変更されません。

最下行の最初の3要素が0ではない場合、マトリックスは通常、3D空間の奇妙で不均一な歪みを生成します。そして、最後の要素を一様な逆スケーリングファクタとして使用することは可能ですが、左上の3x3サブマトリックスでスケーリングを行い、カメラ専用に下の行を残しておく方がよいでしょう。

関連する問題