您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > MANAGED-DIRECTX3D-入门教程
ManagedDirectX+C#开发(入门篇)1:在整理过程中,有些内容为从网上找的资料,部分为翻译国外文章,正所谓“天下文章一大抄,就看会抄不会抄。”,如果侵犯了你的个人权益,可同我联系;2:以前的开发环境为VS.NET20031.1+DirectX9.0。现在开发环境为VS2005,有些程序开发环境记不清了。但应不受影响。3:有些内容为GDI+所做,所有的范例都保存有源代码,但受限于网络情况,有些没有传上去,有需要的可以联系;4:由于才学疏浅,个人水平有限,希望大虾们批评指正;5:联系方式:mail:tongabcd@yeah.netQQ:50759188(加我时注明ManagedDirectX)第一章向量在这一部分中将介绍一些基本的数学知识,主要讨论的内容是向量、矩阵和变换,另外还有一些关于空间点、线、面、体的相关知识,如果你已经掌握了《线性代数》和《空间解析几何》这两门课程,读起来会很轻松,如果以前没接触过它们,也没有关系,只不过会感到有点吃力;在这里会结合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),andk=(0,0,1)。在DirectX中,定义一个二维、三维、四维向量的类在Microsoft.DirectX命名空间中,分别为Vector2、Vector3、Vector45:示例下面代码定义一个二维向量,并绘出一条直线,在这里只写出相关代码,完整代码见源文件;privatevoidRender(){Vector2[]vecs=newVector2[2];vecs[0]=newVector2(300,300);device.Clear(ClearFlags.Target,System.Drawing.Color.White,1.0f,0);device.BeginScene();using(Linel=newLine(device)){l.Draw(vecs,Color.Red);}device.EndScene();device.Present();}执行结果如下:第二章向量的运算(1)1:向量相等几何学上,有同样方向和长度的两个向量相等。数学上,我们说有同样维数和分量的向量相等。例如:如果ux=vx,uy=vy,且uz=vz.那么(ux,uy,uz)=(vx,vy,vz)。在代码中我们能够用“==”判断两个向量相等。2:向量模长向量的大小是有向线段的长度。知道向量的分量,利用下面的公式就能计算出向量的大小。‖u‖表示向量u的长度。例如:计算向量u=(1,2,3)和v=(1,1)的大小。根据公式(1),我们得到:在DirectX中,向量的Length()方法可以得到向量模长,例如:Vector3vec=newVector3(1,2,3);MessageBox.Show(向量V(1,2,3)的模长为:\n+vec.Length().ToString());执行结果:另外一个有用的方法是Vector.LengthSq(),求得的是向量模长的平方,在实际中,它的用途可能超过Length();如果在一个程序中前面需求模长,后面又要对模长平方运算,用此方法就省去了许多计算,我们知道,开平方运算对计算机来说是其实是个痛苦的事情;3:向量单位化向量单位化就是让向量的大小等于1,叫作单位向量。能利用向量大小以及各个分量把一个向量单位化:比如,对于向量u=(1,2,3)和v=(1,1)。单位化方法如下首先,利用前面的求向量模长公式得到‖u‖=√14和‖v‖=√2,因此:以下代码是将向量单位化以后,看看向量的值及模长:Vector3vec=newVector3(1,2,3);vec.Normalize();stringdisString=向量V(1,2,3)单位化以后为:\n;disString+=V(+vec.X.ToString()+,+vec.Y.ToString()+,+vec.Z.ToString()+)\n;disString+=单位化以后的模长为:+vec.Length().ToString();MessageBox.Show(disString,向量的单位化);程序执行结果如下:4:向量相加能够通过分别把两个向量的各个分量相加得到向量之和,注意在相加之前必须保证它们有相同的维数。下面图中显示的是向量相加几何表示:以下代码显示两个向量的相加,并把相加后的结果显示出来:Vector3vec1=newVector3(1,2,3);Vector3vec2=newVector3(3,4,5);Vector3vec3=Vector3.Add(vec1,vec2);stringdisString=V(1,2,3)+V(3,4,5):\n;disString+=V(+vec3.X.ToString()+,+vec3.Y.ToString()+,+vec3.Z.ToString()+)\n;MessageBox.Show(disString,向量的相加);执行结果如下:5:向量相减和加法类似,通过分别把两个向量的各个分量相减得到向量之差。图中显示的是几何学上的向量相减。以下代码显示两个向量的相减,并把相减后的结果显示出来:privatevoidVectorSubtract(){Vector3vec1=newVector3(1,2,3);Vector3vec2=newVector3(3,4,5);Vector3vec3=Vector3.Subtract(vec1,vec2);stringdisString=V(1,2,3)-V(3,4,5):\n;disString+=V(+vec3.X.ToString()+,+vec3.Y.ToString()+,+vec3.Z.ToString()+)\n;MessageBox.Show(disString,向量的相减);}执行结果如下:6:向量的数乘用一个数与向量相乘,向量按比例变化。用负数去乘改变方向。以下代码计算向量的数乘:privatevoidVectorScale(){Vector3vec1=newVector3(1,2,3);Vector3vec3=Vector3.Scale(vec1,10);stringdisString=V(1,2,3)乘以10:\n;disString+=V(+vec3.X.ToString()+,+vec3.Y.ToString()+,+vec3.Z.ToString()+)\n;MessageBox.Show(disString,向量的数乘);}执行结果是:第二章向量的运算(2)7:向量的最大与最小值最大值是从两个向量X,Y,Z值中分别取出最大值组成一个新向量;最小值是从两个向量X,Y,Z值中分别取出最小值组成一个新向量;看以下代码:privatevoidVectorMax(){Vector3vec1=newVector3(6,2,3);Vector3vec2=newVector3(1,2,5);Vector3vec3=Vector3.Maximize(vec1,vec2);stringdisString=V(6,2,3)与V(1,2,5)最大值:\n;disString+=V(+vec3.X.ToString()+,+vec3.Y.ToString()+,+vec3.Z.ToString()+)\n;MessageBox.Show(disString,向量最大值);}执行结果为:8:求两个向量间的一个插值向量设有两个向量pLeft,pRight,得到的向量值计算公式为:pLeft+interpolater(pRight-pLeft).举例代码如下:privatevoidVectorLerp(){Vector3vec1=newVector3(6,2,3);Vector3vec2=newVector3(1,2,5);Vector3vec3=Vector3.Lerp(vec1,vec2,0.5f);stringdisString=V(6,2,3)与V(1,2,5)之间的一个插值向量:\n;disString+=V(+vec3.X.ToString()+,+vec3.Y.ToString()+,+vec3.Z.ToString()+)\n;MessageBox.Show(disString,插值向量);}执行结果:显然3.5=6+(1-6)*0.5;2=2+(2-2)*0.5;4=3+(5-3)*0.5;9:点积数学上定义点积是两个向量的乘积。按下面等式计算:点积有一个重要的定理称为余弦定律;u•v=|u||v|cosθ,表示两个向量的点积是它们的模长和夹角的余弦之积。因此,如果u和v都是单位向量,那么u•v就是它们夹角的余弦。一些点积有用的特性(1)u•v=0,那么u⊥v。(2)u•v0,那么两个向量的角度θ小于90度。(3)u•v0,那么两个向量的角度θ大于90度。比如以下求两个向量的点积示例:privatevoidVectorDot(){Vector3vec1=newVector3(6,2,3);Vector3vec2=newVector3(1,2,5);floatdotValue=Vector3.Dot(vec1,vec2);stringdisString=V(6,2,3)与V(1,2,5)的点积:\n+dotValue.ToString();MessageBox.Show(disString,向量点积);}执行结果如下:10:叉积通过把两个向量u和v相乘的到另一的向量p.把u和v两个向量通过十字相乘得到向量p,向量p垂直于u和v。也就是说向量p垂直于u并且垂直于v。计算公式是:也就是,得到后来的向量X,Y,Z值分别是:注意:向量p垂直于u和v所决定的平面,至于方向因左右手坐标系不同而不同;以下代码为在XOY平面内两个向量作叉积,最后返回的值垂直于XOY平面,也就是说平行于Z轴;privatevoidV
本文标题:MANAGED-DIRECTX3D-入门教程
链接地址:https://www.777doc.com/doc-7430186 .html