1.结果是没有除以w之前的值 yScale = cot(fovY/2) 2.w/h比例越大说明xScale缩放得越小,yScale缩放得越大,而且要正好反比例:w/h = yScale/xScale 。
xScale = yScale / aspect ratio
3.除z或-z后计算只是用后面的关系方便,转换为前面的关系(4D中)还是az+b = z'的。
4.在RH z NDC坐标系中转换到[0,1],OGL中转换到[-1,1],z'= (az + b)/-z => z' = -a + b/-z =>当用zn代入时因为zn是正数,-z也是正数,
所以为:z' = -a + b/zn
z' = -a + b/zf
D3DXMatrixPerspectiveFovRH中,通过代码实验得到:
z' =( az + b) / -z = -a - b/z;
得到:
0 = -a + b / zn;
1 = -a + b / zf;
可以推导出矩阵中a,b的值。
D3DXMatrixPerspectiveFovRH变换矩阵:
D3DXMATRIX* D3DXMatrixPerspectiveFovRH( _Inout_ D3DXMATRIX *pOut, _In_ FLOAT fovy, _In_ FLOAT Aspect, _In_ FLOAT zn, _In_ FLOAT zf );
xScale 0 0 0 0 yScale 0 0 0 0 zf/(zn-zf) -1 0 0 zn*zf/(zn-zf) 0 where:
// 结果是没有除以w之前的值
yScale = cot(fovY/2)
// 通过yScale和缩放比例aspect = w/h,求取xScale
xScale = yScale / aspect ratio
D3DXMatrixPerspectiveFovLH变换矩阵:
D3DXMATRIX* D3DXMatrixPerspectiveFovLH( _Inout_ D3DXMATRIX *pOut, _In_ FLOAT fovy, _In_ FLOAT Aspect, _In_ FLOAT zn, _In_ 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
同理在gluPerspective中:
z' =( az + b) / -z = -a - b/z;
得到:
-1 = -a + b / zn;
1 = -a + b / zf;
可以推导出矩阵中a,b的值。
void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
变换公式: