D3DXMATRIX * pOut,
CONST D3DXVECTOR3 * pEye,
CONST D3DXVECTOR3 * pAt,
CONST D3DXVECTOR3 * pUp
);
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只跟最後投影屏幕的寬高相關聯