前 言
以前是用VC 作计算机图形学的,大约在一年前,公司接到一个用C#+DirecX的项目,从那时起便开始学习Mangaged DirectX ,现将在开发过程中的一点总结发表出来,和同行们共同参考,共同学习,共同进步,前面是一些基础内容,算是入门篇吧,现在正将开发过程中所用到的一些算法整理中,算是中级篇吧。
1:在整理过程中,有些内容为从网上找的资料,部分为翻译国外文章,正所谓“天下文章一大抄,就看会抄不会抄。”,如果侵犯了你的个人权益,可同我联系;
2:以前的开发环境为VS.NET2003 1.1+DirectX9.0。现在开发环境为VS2005,有些程序开发环境记不清了。但应不受影响。
3:有些内容为GDI+所做,所有的范例都保存有源代码,但受限于网络情况,有些没有传上去,有需要的可以联系;
4:由于才学疏浅,个人水平有限,希望大虾们批评指正;
第一章 向量
在这一部分中将介绍一些基本的数学知识,主要讨论的内容是向量、矩阵和变换,另外还有一些关于空间点、线、面、体的相关知识,如果你已经掌握了《线性代数》和《空间解析几何》这两门课程,读起来会很轻松,如果以前没接触过它们,也没有关系,只不过会感到有点吃力;在这里会结合D3DX类中相关的数学模型和有关函数结合程序介绍它们;
在本部分中主要介绍四个方面的内容:
(1)、向量的概念及三维概念;
(2)、矩阵的概念及在DirectX10中的应用;
(3)、如何在DirectX10生成线和面;
(4)、三维数学运算公式及相关类。比如向量的点积、向量的叉积等;
1:向量
在三维欧氏空间直角坐标系中,用有向线段表示向量,我们知道,空间中两点决定一条直线段,如果把这两点的方向也包解在内,就成为有向线段,就是向量,可以看出,向量的两个属性是它的长度和顶点所指的方向。这样,就可以使用向量来模拟既有大小又有方向的物理模型;比如:在三维游戏中经常要出现粒子系统,可以使用向量来模拟粒子的速度和加速度;再比如:直线灯光不仅有灯光的位置,还有光线的方向,摄像机也有位置及视角。因此,向量为在三维空间中表示方向提供了方便;下图显示的都是空间向量;
(图一)
向量有大小有方向,但是和位置无关,长度和方向都相同但起始点位置不同的两个向量是相等的。现在看上面的图中,向量u和v是相等的。
2:坐标系
三维空间中,当固定了X轴方向和Y轴方向之后,Z轴方向可以朝里,也可以朝外,称为左手坐标系和右手坐标系;
3:向量的表示
因为向量与位置无关,因此可以通过平移使向量的起点和坐标系的原点重合。因此,一个向量的标准位置可以只用一个点来描述就可以了,比如说向量v(1,2,3),就是指起点为(0,0,0),终点为v(1,2,3)的有向线段;
通常,使用一个字母来表示一个向量,大小写无关,另外,有时,只需要使用X,Y坐标而不使用Z坐标,比如对一个二维游戏来说,Z值有时是多余的,但有时对一个点来说,除了用X、Y、Z来表示它的位置之外,还需要一个数值来表示它的颜色、变换等信息。因此,在DirectX中,有二维、三维、四维向量。如2、3和4维向量分别是:u = (ux, uy), N = (Nx, Ny, Nz), c = (cx, cy, cz, cw)。
4:单位向量
只有1个单位长度的向量叫做单位向量。如果它们的方向恰好又在坐标轴上,称为单位基向量;它们被叫做i, j和k向量,分别沿着坐标系的x轴,y轴和z轴,并且有1的单位长:i = (1, 0, 0), j = (0, 1, 0), and k = (0, 0, 1)。
在DirectX中,定义一个二维、三维、四维向量的类在Microsoft.DirectX命名空间中,分别为Vector2、Vector3、Vector4
5:示例
下面代码定义一个二维向量,并绘出一条直线,在这里只写出相关代码,完整代码见源文件;
private void Render()
{
Vector2[] vecs = new Vector2[2];
vecs[0]=new Vector2(300,300);
device.Clear(ClearFlags.Target, System.Drawing.Color.White , 1.0f, 0);
device.BeginScene();
using (Line l = new Line(device))
{
l.Draw(vecs, Color.Red );
}
device.EndScene();
device.Present();
}
执行结果如下: