问题1-D3D Drawing

ncopy.gif
  

开学了,一切要学习的东西对于我来说都很新鲜。这个程序是从来没有接触过游戏开发的我的第一个程序,也是我人生中的第一个D3D程序,对我来说很有意义。也许对于有的朋友来说,这个程序很简单。但我仍然把它发出来,希望对学习游戏开发的新朋友有所帮助。

问题描述:
  
  在窗口中显示下面的五个图形,并且用X,Y,Z,R,L键分别控制图形绕X,Y,Z轴顺时针和反时针旋转。

d3ddrawing

  建立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);

这样就完成了物体平移并且旋转的功能。如果要使物体同时绕多个轴旋转,只需要在点乘的时候,乘以需要旋转的旋转矩阵就可以了。但是要注意点乘的方向,因为矩阵的乘法是不满足交换率的。在这里,平移矩阵和旋转矩阵点乘的时候,一定要把旋转放在前面,如果放在后面,物体不会自转。

*原创文章,转载请注明出处*




发表留言

只对管理者显示

自我介绍

Author:三只熊熊
大家好,欢迎来到我的blog!
目前我正在韩国攻读游戏工学研究生,现在在虚拟现实实验室。
作为刚踏入游戏开发领域的初学者,希望大家多多帮助!

잘 부탁드립니다~ ^_^

最新文章
最新留言
最新引用
月份存档
类别
计数器
搜寻栏
RSS连结
连结
Powered By FC2博客

马上开始博客吧!!

Powered By FC2博客