右手坐标系中透视投影剖析-线性中都要除以-z 和 zn、zf是需要负数代入的

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);
变换公式:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值