D3D是通过Device的SetTransform来设置世界变换矩阵的。物体默认是在D3D的世界坐标原点上。如果我们要把它做一些变换再显示出来,就要计算一个该物体的世界矩阵matWorld,再调用Device的SetTransform(D3DTS_WORLD,&matWorld),来变换他的位置。
位移好说,用一个D3DXMatrixTranslation就能统统搞定,关键是旋转。D3D的所有旋转函数所围绕的轴都是穿过原点的,所以如果我们要空间中任意轴旋转,就要和位移配合起来做。
绕任意位置任意方向的轴的旋转:
D3DXVECTOR3 AxisPosition;// 空间中一点,轴会穿过它。
D3DXVECTOR3 AxisDirection; // 任意一个方向。和任意一点可以构成一个条确定的直线。
D3DXVECTOR3 ObjPosition;// 我们的物体的位置。
1,先让物体把原点当作AxisPosition,做一个相对于轴的位移。位移的量为temp = ObjPosition - AxisPosition;。
D3DXMatrixTranslation(&matStep1,temp.x,temp.y,temp.z);
2,然后就可以让物体绕这个过原点的轴转了。
D3DXMatrixRotationAxis(&matStep2,&AxisDirection,fAngle);
3,位移出去,让轴离开原点,到空间上的任意一点AxisPostion去。
D3DXMatrixTranslation(&matStep3,AxisPosition.x,AxisPosition.y,AxisPosition.z);
这样我们就得到了3个矩阵。matStep1,2,3。如何使得这3个矩阵得到的结果合并起来呢?
通过矩阵相乘。
matWorld = matStep1 * matStep2 * matStep3;
然后matWorld就是最终的所有变换都融合进来的世界助阵,用这个矩阵去setTransform,就可以得到物体的世界位置。