日期:2011-12-24  浏览次数:20476 次


DirectX9 3D 快速上手  5
By sssa2000




    这一章的内容相对很简单,控制Mesh的移动,旋转等等,其实这一切都是在对矩阵进行操作。在 DX中,用到的变换有3种,一种是基于Word坐标系的,一种是基于View坐标系的,还有一种是基于投影的变换。而这些变换都是通过矩阵的运算来实现的,在.Net的托管环境下,实现这些操作相对于非托管来说简单一写,不用对矩阵的每个值运算。

关于矩阵的运算和变换的关系,很多文章都有分析,GameRes也有很多这样的好文章,例如:http://dev.gameres.com/Program/Visual/3D/3DGame.mht 这里就有很详细的介绍。

我们这篇文章不研究细节,因为毕竟是快速开发,我们的目标就是用键盘控制读入的Mesh的运动。

其实在前面一篇文章中我们就有提到几个函数,只是没有介绍。我们来看看我们这一篇中要用到的几个简单的函数,从字面我们就可以判断出这些函数有什么用:


 


Matrix.RotateX方法:public void RotateX(    float angle);

Matrix. RotateY方法:public void RotateY(    float angle);

Matrix.RotateX方法:public void RotateZ(    float angle);

Matrix.Translation方法:public static Matrix Translation(float offsetx, float offsety, float offsetz);


 


好,我们现在重新打开上一次的读入Mesh的那个工程,我们现在要加入新的部分,既然是用键盘控制那么就要首先对键盘的状态进行分析:

         String status=null;//用于保存状态



protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)



         {



              // Handle the escape key for quiting



              if (e.KeyCode == Keys.Escape)



              {



                   // Close the form and return



                   this.Close();



                   return;



              }



              // Handle left and right keys



              else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.NumPad4))



              {



                   status="left";  //向左旋转



              }



              else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.NumPad6))



              {



                   status="right";//向右旋转



              }



              else if((e.KeyCode ==Keys.Up )||(e.KeyCode ==Keys.NumPad8 ))



              {



                   status="up";//向上旋转



              }



              else if((e.KeyCode ==Keys.Down  )||(e.KeyCode ==Keys.NumPad2 ))