现在的位置: 首页 > 综合 > 正文

directx中变换矩阵生成算法

2018年05月03日 ⁄ 综合 ⁄ 共 1004字 ⁄ 字号 评论关闭

D3DXMatrixLookAtLH

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(左手坐标系透视投影)

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坐标只跟广角有关联。

D3DXMatrixOrthoLH(左手坐标系正交投影)

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只跟最后投影屏幕的宽高相关联

抱歉!评论已关闭.