directx中变换矩阵生成算法

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

你可能感兴趣的:(DirectX,3d投影,转换矩阵)