问题1-D3D Drawing

开学了,一切要学习的东西对于我来说都很新鲜。这个程序是从来没有接触过游戏开发的我的第一个程序,也是我人生中的第一个D3D程序,对我来说很有意义。也许对于有的朋友来说,这个程序很简单。但我仍然把它发出来,希望对学习游戏开发的新朋友有所帮助。
问题描述:
在窗口中显示下面的五个图形,并且用X,Y,Z,R,L键分别控制图形绕X,Y,Z轴顺时针和反时针旋转。

建立Win32窗口和D3D初始化的方法都比较简单和机械化,网上这方面的文章也很多,希望不知道的朋友自己找找资料来看,这里就不详细的说了。这里主要说下绕轴旋转和旋转的控制。
对于一个物体要让它在原点,也就是世界坐标的(0,0,0)点旋转的话很简单,直接使用dx给我们提供的:
D3DXMatrixRotationX( D3DXMATRIX *pOut, FLOAT Angle );
D3DXMatrixRotationY( D3DXMATRIX *pOut, FLOAT Angle );
D3DXMatrixRotationZ( D3DXMATRIX *pOut, FLOAT Angle );
这个三只方法即可。这里第一个参数是要保存的旋转举列,第二个参数是旋转的角度。要想使物体不停的旋转的话,只要把这段代码放到消息循环中就可以了。如果要想让物体在不同的地方自转(公转的情况下个章节会讲),我们首先把五个物体要移动到希望的坐标点上,这里可以平移矩阵,使用:
D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z );
同样第一个参数是移动后保存的平移矩阵,后面三个参数就是希望移动的坐标。移动后,我在让它旋转。这里要注意,如果是直接先移动了,再直接旋转是达不到想要的效果的,必须要进行矩阵的内积,也就是点乘。什么和什么相乘呢?就是前面说的用旋转矩阵和平移矩阵相点乘。然后把结果再保存到平移矩阵中。矩阵求内积可以使用:
D3DXMatrixMultiply( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM1, CONST D3DXMATRIX *pM2 );
这个方法。看个例子,比如说要把一个图形放在点(5,5,5)绕X轴旋转:
D3DXMatrixTranslation( &ObjWorldPosition, 5.0f, 5.0f, 5.0f);//平移到点(5,5,5)
D3DXMatrixRotationX( &Rx, timeDelta);
//timeDelta是旋转角度,在消息循环中不停的改变这个值就可以使物体不停的旋转
D3DXMatrixMultiply( &ObjWorldPosition, &Rx, &ObjWorldPosition); //点乘
最后再把物体显示到世界坐标中:
Device->SetTransform(D3DTS_WORLD,&ObjWorldPosition);
这样就完成了物体平移并且旋转的功能。如果要使物体同时绕多个轴旋转,只需要在点乘的时候,乘以需要旋转的旋转矩阵就可以了。但是要注意点乘的方向,因为矩阵的乘法是不满足交换率的。在这里,平移矩阵和旋转矩阵点乘的时候,一定要把旋转放在前面,如果放在后面,物体不会自转。
*原创文章,转载请注明出处*


