d3d旋转分解

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,就可以得到物体的世界位置。

你可能感兴趣的:(游戏开发)