第9章 3D游戏开发

  正如你通过这本书看到的一样,有许多你能用XNA中的2D图形库做的真正酷的东西。然而,考虑到现在图形卡和处理器的能力,在3D图形上有了很大的性能提高。3D图形真正是未来的形式,如果你想进行严肃的游戏开发,他们可能是你要专注你大量时间和注意的地方。

  所以,让我们开始吧。因为在XNA中,2D和3D图形被不同地对待,所以先一步创建一个新的工程来初略了解下这个部分。打开Visual Studio,选择File->New->Project。当New Project窗口出现时,在窗口左边的菜单树里选择Visual C#->XNA Game Studio 3.0,在窗口右边选择Window Game Studio 3.0作为模版。命名你的工程3D Madness,选择项目的存放位置,点OK

坐标系统

  相比2D,你将注意到3D图形的第一个不同之处是额外的维数。耶....对了。

  在XNA编写2D游戏与在画布上画画很相似。如果在2D中绘制像画画,那么3D绘制就像是用手持式相机摄像。3D中坐标是三维系统。坐标系统,有时叫世界空间,中心在坐标为(0,0,0)的原点。只有摄像机能摄到的对象能在屏幕上可见。

  由于取决于摄像机在的地方和它的指向,你在3D游戏中的原点画的一个对象能够在屏幕中间,在屏幕地步,在屏幕上其他地方,或者完全离屏。

  3D坐标系分为左手坐标系和右手坐标系。

相机

  在3D中绘制场景很像用手持式相机摄像。你必须决定相机的位置、指向和其他各种属性。

  这些属性存储在Matrix对象里。矩阵是较复杂的数学概念不在本书范围中。幸运的是,XNA在屏幕背后处理了所有的矩阵变换细节。就这点来说,你真的不必担心。现在只需要明白一个矩阵或两个能表示一个摄像机。

  XNA中有两个Matrix对象构成摄像机:view和projection矩阵。view矩阵含有关于摄像机位置、指向、朝向的信息。projection矩阵含有视角、相机看的距离等信息。这个矩阵表示从3D世界到屏幕的2D面的转换。

  要创建一个view矩阵,你用到Matrix类中的一个静态方法叫CreateLookAt。这个方法返回一个Matrix对象并接受一个参数表。参数类型是Vector3.

  要创建一个projection矩阵,用到Matix类中的另一个静态方法叫Matrix.CreatePerspectiveFieldOfView。这个方法也返回一个Matrix对象并接受一个参数表。

  投影矩阵为你的摄像机产生了所谓的视椎体或视域。实质上,它定义了一个摄像机所看到的3D空间并会被绘制在屏幕上。在那个区域的会被绘制在屏幕上,除非被阻挡。区域外的对象则不被绘制在屏幕上。

  添加游戏组件Camera.cs

绘制图元

  既然你安装了一个摄相机,你需要在屏幕上画一些东西。所有3D图形的根本是三角形。如果你画足够的三角形,你能绘制几乎所有形状。把足够的三角形一个一个放在一起,并使之足够小,你甚至能得到一个光滑的弧形表面。

  要画你的第一个三角形,你要定义一些点,或顶点,来表示三角形的角。在你的Game1类中,创建VertexPositionColor对象数组。一个VertexPositionColor对象代表一个有位置和颜色的顶点。在构造器中制定这些值。在LoadContent中初始化他们。

  下一步,在Draw方法中,你需要指定叫VertexDeclaration的东西。实质上,它的作用是告诉你的PC上的图形设备你要给它送些信息,并指定信息的类型。本例中,你将告诉图形设备你要送它一些VertexPositionColor的数据。

  (我自己加的:三角形最后的代码)别让这使你泄气。让我解释下是怎么回事。首先,你需要明白3D图形如何在XNA绘制。XNA 3D中的每样东西是用高级着色语言(HLSL)绘制。HLSL是基于C开发语言,并允许开发者创作出难以置信的强大效果,像水波、反射面和其他视觉特效。在这点上你不用担心太多——在后面章节我们覆盖了详细的HLSL。现在你只需要知道的XNA 3D中所有东西都是用HLSL绘制,通过一个叫Effect(效果)的类。

    Effect类允许你同HLSL代码交互,传数据给HLSL等等。用派生于Effect的类BasiicEffect,你能有效地使用默认的HLSL,不必事先知道任何关于HLSL的东西。这意味着你能集中经历让你的三角形显示,而不必处理头疼的复杂的HLSL代码。

  更多关于effects(特效)。每个effect有一个或更多的techniques(技术)。每个technique有一个或更多的passes(通道)。先前的代码开始了特效,然后在每个当前技术中开始每个通道。这以后都会有更多意义,当我们深入地覆盖HLSL时,但现在,考虑这些Begin和End调用,与SpriteBatch.Begin和End很相似。利用SpriteBatch,所有的精灵必须在Begin和End间绘制。这里的代码一样:所有的通道必须通过他们自己的Begin和End调用执行,这必须位于Effect.Begin和End之间。所有的绘制代码必须位于EffectPass.Begin和End之间。

  实际的绘制代码是调用GraphicsDevice.DrawUserPrimitives。

   它是一个泛型方法,因此,你必须指定你要绘制的顶点类型(本例中是VertexPositionColor)。第一个参数是绘制三角形的方法,我们稍后讨论。第二个参数是你存储你的顶点信息的顶点数组。第三个参数是在数组中的偏移,或开始绘制顶点的索引。你想在verts数据的开头出开始绘制,所以你指定该参数为0。最后一个参数是图元数目,或你准备绘制多少个图元。一个三角形是一个图元。你想绘制1个三角形,所以传递值1给该参数。

矩阵乘法

  之前你设置BasicEffect的World属性是Matrix.Identity。World属性告诉XNA在哪里绘制和怎样用旋转和缩放把它放在世界空间中

移动和旋转

  你有一个很酷的三角形,如果你想移动它到左一点,你用通过Matrix.CreateTranslation方法实现。

  如果你实际上是想持续不断地移动和(或)旋转你的对象,你需要一个变量来表示你的对象的世界。创建Matrix变量,初始化为Matrix.Identity。

  令 BasicEffect的World属性用这个变量

  在Update方法中加入代码

背面剔除

  剔除是3D图形中限制屏幕上绘制的东西的数量以提高性能的过程。实质上,背面剔除的目的是只绘制朝向摄像机的图元面。

  XNA默认剔除反时针绘制的样式。

  你能在Draw方法中用下面的代码关掉剔除

  GraphicsDevice.RenderState.CullMode=CullMode.None;

更多有关旋转

  当程序开始时,你的三角形似乎是绕着它所在的位置在旋转。如果你移动三角形到左边,它仍然旋转,但是现在它看上去是绕着原点而不是它的位置。这是因为平移和旋转的命令在最后的效果中有很大的不同。

  当旋转被应用时,旋转总是使物体绕原点旋转。在你的代码中你首先应用的是平移然后是旋转。

  要使你的物体不管在哪里都绕它所在的位置旋转,你需要首先应用旋转。

更多的旋转

  更多的旋转函数

基本图元

  绘制矩形。你不能直接绘制矩形——你需要用三角形绘制。两个相邻的三角形构成一个正方形或矩形。

应用纹理

  现在你有了一个矩形,你准备应用一个纹理到你的矩形上。首先,你要告诉图形设备你将对你的顶点使用纹理。当前,你在使用的代表你的顶点的对象类型是VertexPositionColor,它告诉XNA你为你的顶点想用到位置和颜色。你需要改变这以使用一个不同的对象类型叫VertexPositionTexture,它表示一个顶点有位置和纹理。VertexPositionTexture有两个参数,Vector3参数代表顶点位置,Vector2参数代表纹理坐标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值