第一章 第三节 从定义少许原始结构开始

翻译 2007年09月14日 22:15:00
 

从定义少许原始结构开始

在我们进行游戏引擎代码的冒险之旅之前,定义一些将要用到的低级或者初级的数据结构。C#有两个方法来定义数据和相关的方法。第一个是结构(struct),它是一个值类型,在栈上分配而不是在托管堆。结构类型没有类(class)类型强大和灵活,但是对于小数据单元更加高效,例如组成游戏引擎基础的原始结构(primitives)。

 

首先是Vector3,由三个单精度浮点变量(X, YZ)组成的简单结构。它构成了引擎中大部分的3D渲染和物理动力学。我们使用这个类型来描述对象从三维空间中任意点到速度、加速度和对每个轴的压力。我们的游戏引擎使用的三维系统,X轴正方向向右,Y轴正方向向上,Z轴正方向向前。本书中大部分代码使用Microsoft DirectX提供的vector类。在第十章使用了我们自己实现的类,来构造既可以被DirectX又可以被OpenGL使用的动态库。这个结构的C#代码如清单1-1所示:

 

清单1.1Vector3 C#定义

public struct Vector3

{

Public float X = 0.0;

Public float Y = 0.0

Public float Z = 0.0;

}

 

注意:此游戏引擎中的单位都是使用英文系统的。所有的距离都是以英尺来度量。

 

Vector3的值可以在两个基本的坐标系统中引用。第一个叫做世界坐标系统。这个系统位于由游戏作者选定的世界数据库的中点。本书引擎中的世界坐标原点在地形模型的西南角。如此一来,向西移动X坐标都是正,向北移动Z坐标都是正。另外一个坐标系统是局部坐标系统,也称为体坐标系统(body coordinate system)。对于地形模型,这两个坐标系统没有区别。对于每个其他对象,局部坐标用来定义组成对象的顶点。就像你将在第三章看到的,两个坐标系统都要转换成屏幕坐标(二维坐标),以便正确的绘制到屏幕上。

 

第二个初级结构是Attitude,它是Vector3 的变种,它描述了绕每根轴的旋转量。我们常常见到它们被称为欧拉角(Euler angles)。为了高效,所有角度(旋转角度)都存储成弧度。这是数学三角函数需要的格式。如果在我们开发的游戏引擎中使用单位度,可能对我们程序员来说比较好理解,可是不值得在创建变换矩阵时每次都去转换单位。

 

有几个和Attitude相关的术语需要在我们继续学习之前搞懂。Pitch是绕X轴旋转的角度,从原点向轴看,顺时针方向为正。Yaw是绕Y轴旋转的角度,从原点向轴看,逆时针方向为正。Roll是绕Z轴旋转的角度,从原点向轴看,顺时针方向为正。似乎Yaw与其他两个的定义有一点区别。这样做的目的是为了与罗盘航向角保持一致。你也许知道,罗盘把北定义为零度角,角度在顺时针方向递增。在我们的系统,只有当从轴看向原点才和它一致。由于所有的旋转角度都是以从原点看向轴来定义的,所以我们必须把yaw以相反方向定义才能与罗盘角保持一致。表示这个结构的C#代码如清单1-2所示。

 

清单1.2Attitude C#定义

public struct Attitude

{

 public float Pitch = 0.0;

 public float Yaw = 0.0;

 public float Roll = 0.0;

}

 

第三个也是最后一个我要定义的初级结构是Vertex。这是Vector3的扩展,包含了纹理映射需要的信息。一个Vertex定义三维空间中的一个点。在后面你马上会看到面片(描述三维对象的数据的3D行话)是由许多的顶点,再加它们如何连接和覆盖他们的纹理这些附加信息组成。这个结构里的第一个变量是Vector3类型叫做Point,它保存顶点位置。接下来的两个变量(TUTV)是纹理映射里的二维坐标值,它对应位于此纹理映射里的一个顶点。纹理仅仅是一个位图,它描述了顶点上和顶点之间的像素怎么绘制。如果有什么还不能理解,不用担心,在第三章讲渲染流水线的时候还会更加详细的讨论这些细节。我们不必自己开发这些vertex结构。友好的Microsoft已经在托管DirectX中为我们提供了所有的基本vertex结构。表示这个结构的C#代码如清单1-3所示。

 

清单1.3VertexC#定义

public struct Vertex

{

 public Vector3 Point;

 public Vector3 Normal;

 public Color Diffuse;

 public Color Specular;

 public float TU = 0.0;

 public float TV = 0.0;

}

 

这是Vertex的第一个也是最基本的版本。本书后面,你将会碰到为特定目标做过裁剪的更加复杂的版本。这些其他的版本将支持多重纹理,无纹理表面等特性。

《Thinking in JAVA》读书笔记_第一章_1.2~1.3

1.2 每个对象都有一个接口 为何说没个对象都有一个接口?那就要从这个接口的定义上来说。在《TIJ》中所给出的解释是,接口确定了对某一特定对象所能发出的请求。 由之前的学习,我们可以认识到。对象是某个...
  • dy13145687
  • dy13145687
  • 2015年04月25日 16:08
  • 307

信息学奥赛一本通 珍珠

珍珠(bead) 题目在这个网页吔:点击打开链接 和往常一样,做题之前会胡思乱想: 1、入度和出度解决?样例可以过的嘛……可以过但好像不行Emmm……对!因为你万一只与一个点相连,但是后...
  • Jerry_wang119
  • Jerry_wang119
  • 2018年01月30日 17:42
  • 99

从零开始学java第一章 认识java

从零开始学java第一章 一、认识java        1. java的来源             众所周知,java是面向对象的变成语言。那么何为“面向对象”呢?这里就要引入一个思...
  • linan123456789
  • linan123456789
  • 2016年10月18日 09:53
  • 829

2015年Java工程师面试题总结

一、Java基础 1. String类为什么是final的。 2. HashMap的源码,实现原理,底层结构。 3. 说说你知道的几个Java集合类:list、set、queue、map实现类咯...
  • andybbc
  • andybbc
  • 2016年02月20日 23:34
  • 670

第一章 --- 第三节

1.8 ---- 地址总线 地址总线上能传送多少不同的信息,CPU就可以对多少个存储单元进行寻址。 小知识:我们常说,32位CPU或者64位CPU,多少位指的就是CPU的寻址能力,也就是地址总线的...
  • lefter1986
  • lefter1986
  • 2011年11月27日 09:25
  • 325

【第一章 第三节】

【第一章 第三节】
  • u012966411
  • u012966411
  • 2013年12月09日 21:13
  • 193

我的第一个完整的小说爬虫

纪念我的第一个爬虫程序,一共写了三个白天,其中有两个上午没有看,中途遇到了各种奇怪的问题,伴随着他们的解决,对于一些基本的操作也弄清楚了。果然,对于这些东西的最号的学习方式,就是在使用中学习,通过解决...
  • P_LarT
  • P_LarT
  • 2017年08月13日 21:33
  • 378

Java数组和链表两种结构的操作效率,在哪些情况下,哪些操作的效率高

首先这个问题,没有固定答案,全看个人理解,毕竟这2个的数据结构,大家肯定都是知道的。能有如下回答,基本就够用啦。 数组: 数组就像一个班级一样,一旦分完班,一个班多少人,每个人的学号啥的都是确定的啦...
  • qq_27093465
  • qq_27093465
  • 2016年08月21日 16:19
  • 4410

互联网面试总结(二) : 概述题

概述题 本人对网上的一些面试题做了一些整理,希望对大家面试有帮助 JAVA 基础 1.如何在JVM虚拟机挂掉的时候,做一些操作,例如发邮件通知?个人总结 可以使用Runtime里面的addShutd...
  • Evan_Leung
  • Evan_Leung
  • 2016年03月08日 08:03
  • 1112

思科CCNA第二学期第一章答案

1 关于负载均衡特征的描述,哪两条是正确的?(选择两项。) 负载均衡是指路由器将相同的数据包发送到不同目的网络。 ...
  • u014253173
  • u014253173
  • 2015年01月19日 15:59
  • 3285
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第一章 第三节 从定义少许原始结构开始
举报原因:
原因补充:

(最多只允许输入30个字)