几何渲染管线把顶点作为输入,可进行3种变换:世界变换,摄像机变换和投影变换,并将这些变换施展到顶点。
1世界变换:
一个模型的顶点要从本地坐标系统变换到世界坐标系统。世界变换包含平移,旋转,缩放的 混合变换。目的要生成世界矩阵W,可由缩放矩阵S,旋转矩阵R,平移矩阵T混合生成,一般是先放缩,再旋转,后平移,W= S * R * T.
1 平移矩阵:
通过执行函数D3DXMatrixTranslation( T , x , y , z )生成,x ,y ,z为模型在世界空间坐标。
2 缩放矩阵
通过执行函数D3DXMatrixScaling( S , x , y , z )生成,x, y, z分别为在各轴上的缩放倍数。
3旋转矩阵
执行函数D3DXMatrixRotationX(& XR ,x)生成绕X轴旋转x 的旋转矩阵XR。
执行函数D3DXMatrixRotationY(& YR ,y)生成绕Y轴旋转y 的旋转矩阵YR。
执行函数D3DXMatrixRotationZ(& ZR, z)生成绕Z轴旋转z 的旋转矩阵ZR。
执行函数D3DXMatrixRotationYawPitchRoll(&R ,& XR, & YR,& ZR)可得经过混合旋转的旋转 矩阵R。
执行IDirect3DDevice9接口的SetTransform(D3DTS_WORLD,&W )设置世界矩阵。
2摄像机变换:
摄像机在世界空间中有一逻辑坐标和朝向,用于创建摄像机矩阵V的起点。
创建1:由平移矩阵和3个轴的旋转矩阵生成 V = T * XR * YR * ZR
创建2:执行函数D3DXMatrixLookAtLH( & V, eye , lookat , up ), eye为摄像机位置,lookat为摄像机朝向,up为顶方向。现讨论一下lookat的获取:
lookat=eye+dir,而dir则是摄像机的观察方向,可由D3DXVec3TransformNormal(&dir,&olddir,&rot_mat)获得,olddir为原摄像机的观察方向,rot_mat为矩阵变量
而rot_mat则由D3DXMatrixRotationYawPitchRol(&rot_mat,x,y,z)获取,
x,y,z分别为在x,y,z轴的旋转分量.lookat可由上述几步骤计得。
执行IDirect3DDevice9接口的SetTransform( D3DTS_VIEW, &V )设置摄像机矩阵
3投影变换:
投影变换转换摄像机观察平截头体到立方体形状。
执行D3DXMatrixPerspectiveFovLH( & P , Fovy , Aspect , Znear , Zfar )生成投影矩阵P
Fovy 为视界,Aspect 为横纵比,Znear摄像机能观察到的最近距离,Zfar为最远距离。
执行IDirect3DDevice9接口的SetTransform( D3DTS_ PROJECTION, & P )设置投影矩阵