D3D视图转换矩阵、投影矩阵的具体形式

来源:互联网 发布:win mac双系统黑苹果 编辑:程序博客网 时间:2024/06/06 12:36
一直来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只跟最后投影屏幕的宽高相关联

原创粉丝点击