09 2011 档案
摘要:12.4 使用UMF文件为 www.UltimateGameProgramming.com 创建的最终模型格式(Ultimate Model Format,UMF),它的模型文件作为一种常用的文件格式,用于保存几何图形数据。该文件格式是一种简单的二进制格式,可以保存顶点位置、纹理坐标、法线值、顶点颜色和三角形索引。UMF文件格式旨在创建静态网格并将其显示在屏幕上。将来,还会有其他版本可以指定动画信息的格式。UMF格式在www.UltimateGameProgramming.com得到广泛使用。该文件格式使用简单,既包含了小的静态对象和角色,也包含了大的静态对象和角色。同样还提供了一种创建自己的
阅读全文
摘要:token.h#ifndef _UGP_TOKEN_H_#define _UGP_TOKEN_H_class CToken{public: CToken() : m_length(0), m_startIndex(0), m_endIndex(0), m_data(0) {} ~CToken() { Shutdown(); } void Reset(){ m_startIndex = m_endIndex = 0; } void SetTokenStream(char *data); bool GetNextToken(char *buffer); bool...
阅读全文
摘要:接下来要介绍的模型文件格式是OBJ格式。该格式非常流行,而且可以使用大量3D建模软件导出。OBJ是一种简单的格式,它是可以用任何文本编辑器打开和保存的文本文件。准确的说,OBJ文件并不是设计用于处理与动画相关的信息,但如果有一个需要快速加载到场景中的静态对象,OBJ也许会有用。已经被导出OBJ格式的模型由顶点、法线、纹理坐标和三角形索引(外观)组成。因此,在OBJ格式中将不为除了简单静态网格之外的任何对象使用模型。【注意】 使用由不同类型软件导出的OBJ文件时一定要慎重。例如,用Lightwave7.5创建的OBJ文件就不同于3D Studio Max导出的OBJ文件。试着用为稍有不同类型文件
阅读全文
摘要:在现代游戏中,人物和模型由针对每个对象的成千上万个多边形组成。对纹理映射而言这非常复杂,因为它需要为每个多边形的每个顶点设置一对TU和TV纹理坐标。假定有一个包含了5000个三角形的模型。假定不涉及加索引的几何图形(索引),而只使用三角形,那么在整个模型中将有15000个顶点。至此,除了内置的Direct3D以外,还得手动指定几何图形数据。如果一个模型包含5000个多边形,那么试着指定这些多边形中的每个几何图形数据,就会是一场噩梦。同时还要为顶点手动设置纹理坐标,从时间角度而言,这也是不可以接受的,并且绝对不现实。即使设法对所有模型都做了这一点,那么也会存在将这些信息硬编码到源代码中,以及其他
阅读全文
摘要:DirectSound和DirectMusic是DirectX中两个独立的声音API,它们都可以播放.wav声音(DirectMusic还可以播放.midi声音)。即便它们是独立的,这两种声音API也可以同时用于管理和操作声音数据、调整音廖、3D声音和效果。DirectSound能完成一些DirectMusic所不能完成的工作,反之亦然。所以在开发时需要同时使用两者。例如,DirectMusic需要使用DirectSound设置单个声音文件的音量、音调和摇摄,因为它自己不能完成这个工作。在介绍这两种API作为声音接口完成任务的函数、原型和结构之前,下面几个部分将详细介绍DirectSound和
阅读全文
摘要:游戏项目第9部分:增加输入系统该游戏项目将添加对引擎和主菜单的支持。引擎项目中出现的三个新文件分别是InputInterface.h、DirectInput.h和DirectInput.cpp。第一个文件InputInterface.h用于定义输入系统和输入设备基类的头文件。每个类都提供了派生类需要实现的默认函数。基类中的每个成员函数都是从DirectInput演示程序中提取出来的相同类。实际上,所有这些代码都很相似。在该输入系统和为演示程序创建的输入系统之间的唯一差别在于该输入系统将事情按照各自的类分开处理,而不是包含在一个巨大的类中一起处理。InputInterface.h#ifndef
阅读全文
摘要:初始化DirectInput系统,这仅需调用DirectInput8Create()函数即可.HRESULT WINAPI DirectInput8Create( HINSTANCE hinst, // 实例句柄 DWORD dwVersion, // 版本标识符 REFIID riidltf, // 输入系统的唯一标识符 LPVOID * ppvOut, // 指向正在创建的输入系统对象指针 LPUNKNOWN punkOuter // IUnKnown相关接口指针 ); 如果调用成功,D...
阅读全文
摘要:第一个新文件是BoundingGeometry.h头文件。该头文件包含了3个类和两个函数。第一个类是边界几何图形基类,创建其他边界几何图形时可以从该类派生。第二个类是边界框类,第三个是边界球类。头文件中的两个函数分别是BoxToBoxIntersect()和SphereToSphereIntersect()。这两个函数分别用于检测两个方框和两个球体之间的碰撞。每个类中的成员函数分别是CreateFromPoints()、isPointInside()、两个Intersect()、GetPlanes()和isRayInside()。在创建涉及的边界几何图形时,会用到CreateFromPoint
阅读全文
摘要:在3D虚拟世界中检测碰撞?如果世界是由多个动态物体构成的,充满了成万或成千万的三角形,那么如何用一种快速有效的方式检测和避免可能发生的碰撞?要解决这个问题其实并不简单。使用数学运算检查两个三角形之间是否存在碰撞,非常消耗CPU,同样对于射线到三角形的测试也是如此。假想一下,如果一个三角形需要很大的CPU开支,那么几千个或几百万个三角形将会立刻摧毁所有现代处理器的性能。在游戏开发中实现某些事物的最快方法是采用捷径,并在必要时使用近似值。如果问题可以简化为一个更容易处理、计算更快的形式,那么有可能实现某一种技术而不会影响程序性能,而这是在长时间做某件事情时才会出现的情况。然而这样做会产生新问题:使
阅读全文
摘要:要介绍的引擎中出现的第一个新文件是mathDefines.h头文件。该文件保存了所有的define语句,这些语句是数学库、引擎及游戏都要用到的内容。这些define语句包含了π(圆周率,圆的周长与直径的比值)的定义、平面结果和将度转换成弧度的宏。该文件随着本书的深入而不断扩充,但目前它非常小,只包含几个define语句。程序清单8.30给出了mathDefines.h头文件的内容。mathDefines.h头文件#ifndef _UGP_MATH_DEF_H_#define _UGP_MATH_DEF_H_#define UGP_FRONT 0#define UGP_BACK 1...
阅读全文
摘要:平面是一个无限扩展的区域。读者可以将其形象化为沿着上下两个方向无限扩展的平面墙。如果很难理解平面这个概念,那么试着考虑一下宇宙。想象一样,宇宙非常平而且沿着所有其他边不断无限扩展的情况。虽然屏幕区域有限,但可以在屏幕上绘制平面,因为只要对有限数量的像素做阴影处理即可。然而,在Direct3D和OpenGL中并没有内置渲染平面的方法。所以,如果不能渲染平面,那就会出现问题,即平面到底对谁有好处?关于这个问题,答案有很多。最常见的一个答案就是几何图形选择和碰撞检测有了几何图形选择,就可以创建一个平面或一系列平面,而这取决于几何图形位于平面的哪一侧,并可以快速确定是否需要绘制该对象。因为这可以很大程
阅读全文
摘要:矢量是游戏开发中涉及到的最基本的对象。矢量有多种形式,可以是2D、3D或4D等。3D矢量是一个包含3个浮点数的结构,每个值代表矢量中不同的轴。这些值分别是x、y和z轴,可用于描述三维空间。矢量用于描述3D空间中的方向,它可能也是最常用的数学对象。矩阵是游戏开发中第二个最常用的数学对象。矩阵主要用于将矢量从一个坐标系转换到另一个坐标系,还可用于旋转和平移。矩阵由浮点数的2D数组组成。3×3矩阵由3行、3列共9个元素组成,4×4矩阵是由4行、4列共16个浮点元素组成的2D数组。四元组用于描述旋转。四元组是由4个浮点数w、x、y、z构成的结构,像4D矢量。虽然矩阵也可用于旋转,但
阅读全文
摘要:实际上根据为引擎添加脚本支持的要求,目前要做的工作是将本章创建的文件复制到Stranded引擎的文件夹中。这些文件分别是CommandScript.h、CommandScript.cpp、PropertyScript.h、PropertyScript.cpp、Token.h和Token.cpp。每个类都可以独立工作,所以转换工作就非常简单。
阅读全文
摘要:文件是由分开的不同文本块组成的。这些文本可用作命令、属性名称、字符串、数字等。所使用的这些内容有一个共同点,即它们是用分隔符分开的。分开的每一组文本称为一个令牌。文件可以由许多令牌组成,每个令牌都有自己的用途和含义。在不考虑出现令牌原因的情况下,令牌只是一些文本。如果愿意的话,有时可以将文件分隔成一系列令牌——令牌流——这是一种很好的做法。如果读者曾经研究过更高级类型的脚本,实际上就会发现这只是为了将脚本编译成一种更低级形式而要做的一些工作。也许在创建命令和属性脚本系统时,已经使用过令牌流。虽然有一种获取信息的方法,但如果本该使用令牌流而没有使用,那么这个方法就不是很清晰。例如,对属性脚本而言
阅读全文
摘要:命令脚本是一种在文件中包含许多命令的脚本。命令脚本和属性脚本非常相似,除了每一行第一个单词所代表的意思不同之外。在基于命令的脚本中,通常要有一个文件,并且会解释该文件,直到文件执行到结束或是出现错误为止。伪代码:Open the script file and get the line count.Create an array of strings for each line.In the application loop through each line.Get the command and check if it is invalid or a comment.if valid, g
阅读全文
摘要:script.spt# This is an example of a comment.teapotColor 0.0 0.0 1.0cameraPosition 0.0 0.0 -5.0# These are not used but are here to test loading strings and ints.totalTeapots 1description This just a teapot in a 3D scene! PropertyScript.h#ifndef _UGP_PROPERTY_SCRIPT_H_#define _UGP_PROPERTY_SCRIPT_H_.
阅读全文
摘要:为了启动项目,这里将在defines.h文件中为想要在引擎中使用的雾和多采样功能添加几个define语句。对雾而言,将使用想要创建的雾的枚举类型。对多采样而言,将使用可以支持的多采样枚举类型。对该引擎而言,这里将支持非多采样、2倍、4倍、8倍和16倍速率采样等几种采样类型。雾枚举类型的名称是UGP_FOG_TYPE,而多采样枚举类型的名称是UGP_MS_TYPE。更新后的defines.h文件如程序清单6.15所示。注意在defines.h文件末尾处添加枚举类型,由于该文件的其他内容已经介绍过,因此这里没有列出。程序清单6.15 更新后的defines.h头文件#ifndef _UGP_DEF
阅读全文
摘要:动态链接库、静态库、import库区别 动态链接库(Dynamic Linked Library):Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数; User32.dll,它
阅读全文
摘要:粒子系统保存和操纵一种称为粒子的元素。粒子系统的职责就是对粒子施加不同的作用力,为它们增加一种真实的外观。粒子系统的类型包括爆炸、烟、火、火花等,而其他类型的效果可由许多小的元素构成。粒子是一个小物体,包含多种属性,如位置、速度(方向)和质量。游戏中,粒子通常是添加了纹理的小正方形,通常面向摄象机。在实现点状sprite时已经介绍过这一点。点状sprite可以由粒子系统使用,从而有效地生成多种不同的效果。粒子系统示例如图6.5所示。通常,粒子相互之间独立作用,但却限制在粒子系统范围内。例如,所有的粒子也许从相同位置开始或从比较接近的位置开始,但它们都有自己的属性,将彼此分隔开。同样,通常在游戏
阅读全文
摘要:通常会多次要在3D场景中显示大量的细节。例如,混凝土上的裂纹,或粗糙墙面的凸凹不平之处。也许并不总是想在纹理图像自身包含这种细节。通常,一些彩色图纹理虽然从远处看的时候它们很好,但靠近看时,也许会让观察者觉得有些模糊。使用一种名为细节映射的技术有助于解决这些问题,或至少得到改善。细节图是一个灰度图,保存小而精确的细节内容。当将其和颜色图一起施加到表面上时,最终的图像看上去原始图像好像有更多的细节。同样,使用细节图时,颜色图在从上靠近看时,看上去不模糊。使用细节图为表面增加细节,给图增加小的裂纹以及线条,这样可以提高表面的真实感。对墙和类似表面更是如此。细节映射的演示成名为DetailMappi
阅读全文
摘要:为3D场景增加雾会得到更真实的渲染效果。雾可以增加大量真实感,尤其对地形、树林地区以及幽灵般的户外背景。同样,雾可以很好地限制观察者对环境的可见度。现实中并不存在无限的视觉距离。事实上,这就是虚拟环境的一个镜像。通过限制观察距离,同样可以限制发送给管道的多边形数目。这对于提高渲染时间更有用。如果读者还记得PS游戏机上的第一个游戏《寂静岭》(Silient Hill),该游戏物景中有许多雾,很难看到外面的事物,除非是事物就在游戏玩家的面前,就可以很清楚地了解这一点。Direct3D中有两类硬件雾可用:顶点雾和像素雾。顶点雾是按照每个顶点来计算雾的数据,而像素雾根据像素级别计算雾的数据。由于通常像
阅读全文
摘要:1 多采样 (抗锯齿)全景抗混叠是一种减少在渲染多边形的边时所产生的参差不齐效果的方法。抗混叠物体也会对渲染后的整个场景产生负面影响,尤其是处理动画更是如此。通过实现对像素的本地模糊处理,并在屏幕上显示出一个平均结果而实现全景抗混叠。在Direct3D中启用多采样将实现程序中的抗混叠。多采样将对程序性能的影响很大。这种性能影响取决于所选的样本数,所以在考虑更多的样本数时,一定要牢记这一点。采样数越高,渲染的场景质量就越好。样本最大数取决于支持它的硬件。某些硬件根本不支持多采样,而有一些硬件也许可以支持多大4倍速率的采样,还有一些可以支持8倍速率或更高的采样率。在Direct3D 9.0中,多采
阅读全文
摘要:main.h头文件包含了用于GUI系统和控件的define语句。这里将在游戏源文件中添加3个新函数,它们分别是InitializeMainMenu()、MainMenuCallback()和MainMenuRender()。其中InitializeMainMenu()由GameInitialize()函数调用,将整个GUI的主菜单加载到内存中。MainMenuRender()由GameLoop()函数调用,借助渲染系统将主菜单显示在屏幕上。函数MainMenuCallback()是GUI系统的回调函数,对按钮动作做出响应。main.h#ifndef _UGP_MAIN_H_#define _U
阅读全文
摘要:GUI系统将主要由按钮和静态文本控件对象构成。同样,可以指定和按钮、文本一起显示的背景图。GUI系统是2D的。这意味着指定对象位置时,用不到Z轴。另外,使用正交投影方式渲染GUI,这样可以根据像素位置指定屏幕位置,而不是使用标准单位来指定屏幕位置。回忆一下(0,0)对应的是屏幕的左上角。在Windows系统中,左上角同样是(0,0)。有了该信息,就可以轻松地确定玩家的鼠标指针是否在要创建的GUI系统的控件上或是正在按该控件。只要在规划按钮和文本位置时,记得左上角是(0,0),就能创建任何限制在系统范围内的GUI。当涉及到背景图时,没必要考虑它的位置,因为该图像是一个由两个三角形构成的全屏图像。
阅读全文