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.x 0
xaxis.y yaxis.y zaxis.y 0
xaxis.z yaxis.z zaxis.z 0
-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只跟最后投影屏幕的宽高相关联

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值