关闭

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

标签: vectormicrosoftfloat引擎structc#
878人阅读 评论(0) 收藏 举报
分类:
 

从定义少许原始结构开始

在我们进行游戏引擎代码的冒险之旅之前,定义一些将要用到的低级或者初级的数据结构。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的第一个也是最基本的版本。本书后面,你将会碰到为特定目标做过裁剪的更加复杂的版本。这些其他的版本将支持多重纹理,无纹理表面等特性。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:76038次
    • 积分:1189
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:36篇
    • 评论:42条
    最新评论