D3D視圖轉換矩陣、投影矩陣的具體形式

一直來D3DXMatrixLookAtLH()函數內部做些什麼運算不是很清楚,今天偶爾在DiectX 幫助文檔裏看到原來
D3DXMATRIX * D3DXMatrixLookAtLH(
D3DXMATRIX * pOut,
CONST D3DXVECTOR3 * pEye,
CONST D3DXVECTOR3 * pAt,
CONST D3DXVECTOR3 * pUp
);
zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

xaxis.x yaxis.x zaxis.x0
xaxis.y yaxis.y zaxis.y0
xaxis.z yaxis.z zaxis.z0
-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) l

這個函數作用世界座標轉換,怎麼轉呢?就是以eye 座標爲中心,xaxis爲X軸,yaxis 爲Y軸 zaxis 爲Z軸轉換的。世界座標都要經過這樣轉換,轉換到攝像機相對座標,然後投影。

 

說道投影分爲透視投影和平行投影(或正交投影)D3D中

D3DXMatrixPerspectiveFovLH(左手座標系透視投影)

D3DXMatrixOrthoLH(左手座標系正交投影)

看看算法:

D3DXMATRIX * D3DXMatrixPerspectiveFovLH(
D3DXMATRIX * pOut,
FLOAT fovy,
FLOAT Aspect,
FLOAT zn,
FLOAT zf
);

xScale 0 0 0
0 yScale 0 0
0 0 zf/(zf-zn)1
0 0 -zn*zf/(zf-zn)0
where:
yScale = cot(fovY/2)
xScale = yScale / aspect ratio
可以看出透視投影,3維點x座標跟FOV(廣角)和投射屏幕縱橫比(或者膠捲縱橫比)有關係,而y座標只跟廣角有關聯。

 

D3DXMATRIX * D3DXMatrixOrthoLH(
D3DXMATRIX * pOut,
FLOAT w,
FLOAT h,
FLOAT zn,
FLOAT zf
);

2/w 0 0 0
0 2/h 0 0
0 0 1/(zf-zn) 0
0 0 zn/(zn-zf) 1
正交透視X,Y只跟最後投影屏幕的寬高相關聯

發佈了12 篇原創文章 · 獲贊 16 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章