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

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

计算机操作系统第一章第三节

  • 2011年12月24日 11:10
  • 3.91MB
  • 下载

数据结构第三节作业

  • 2015年05月22日 20:11
  • 279KB
  • 下载

一周学习内容总结(第一章至第三章的第三节)

图像操作读取图像使用imread函数可以将图像读入到MATLAB环境中,如果参数中不包含任何路径时,该函数会从当前目录中寻找该文件。正如如下调用t=imread('sin.png');如下图为函数im...

第一章第三节 让4小时等于8小时——《与时间同行》(4)

职场中,人人都想提高工作效率。   咱们都生活在一个四维的空间里,正因为有了时间维度,所有的事情不可能永远停止不前,也不可能在一瞬间同时发生。而我们要找的,是怎样提高工作效率,让1等于甚至大于2,...

第一章 --- 第三节

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

全栈工程师之路-中级篇之小程序开发-第一章第三节阅读官方demo

在网上好多人,喜欢找别人写好的一些线上的项目源码,比较完整的。想着学习的更加实用和全面一点。 这无可厚非,但是,我发现有好多人并不是很在意官方提供的demo。 比如ionic的tabs demo就没有...

进击的KFC:第三节:C语言:循环结构 循环的四个要素

C语言基础第三节:循环结构 循环的四个要素

Box2D C++教程 第三节:Testbed结构

http://www.firedragonpzy.com.cn/index.php/archives/2590 声明:本文翻译自Box2D tutorials-Testbed struc...

html 第三节 (结构基础与超链接)

1.特殊字符(需要记住是&   ;  格式   且; 是英文模式) 2.div元素 超链接基础 1.绝对链接与相对链接 针对相对链接 要链接的文件位于当前页面所在文件夹的上一级文件夹时...

七月算法深度学习 第三期 学习笔记-第三节 卷积神经网络与典型结构

一、神经网络与卷积神经网络  1.层级结构 : o 数据输入层/ Input layer : 1)去均值 :各维度中心化为零  2)归一化:幅度归一化到同样的范围  3)PCA/白化:PCA...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第一章 第三节 从定义少许原始结构开始
举报原因:
原因补充:

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