1、3D 游戏开发大全(高级篇)在我的第一本书3D 游戏开发大全 中,我们曾经对 3D 游戏开发完成了一次犹如探索原始丛林般的旅程:首先,我们对 3D 游戏产业进行了初步了解;接着,在编程和三维概念上小试牛刀;随后,我们开始在 Torque 这个广袤的大草原上阔步前进,使用 Torque 引擎开发了一些简单的单玩家游戏环境;顺道,我们还经过了用游戏艺术手法(模型和纹理) 创作的翠绿森林。在整个神奇的探索之旅中,我们对游戏开发的理解逐渐明晰起来,对 Torque 如何帮助我们初步开发游戏也有了更好的认识。经过这一旅程,我们了解了 3D 游戏开发的各个方面,并仔细探究了在 3D 游戏开发道路上可能遇到
2、的一些问题。 然而,到目前为止,我们只是对所遇到的很多特性和概念匆匆一瞥,未能深究。毕竟游戏开发之旅的沿途风景这么美丽多饶,每一处都让人应接不暇,面面俱到也就是面面不到。所以,在本书中,我们将故地重游某些地方并进行更深入的探索,以期学习更多的知识,从而形成全面的认知和理解。前言与目录 3D 游戏开发大全 (高级篇 ) 前言 3D 游戏开发大全 (高级篇 ) 目录第 1 章 多目标环境 1.1 TorqueScript 脚本语言 1.2 3D 数学预览 1.3 可玩性 1.4 制作 Bots 1.4.1 AI 概念 1.4.2 继续上一个话题 1.4.3 群体动力学 1.5 艺术性 1.5.1
3、细节 1.5.2 入口 1.5.3 光照 1.5.4 外皮脱卸 1.6 本章小结第 2 章 使用 TorqueScript 脚本语言 2.1 Torque 项目的组织 2.2 安装 Torque 2.3 TorqueScript 概览 2.4 问题解决机制 2.4.1 日志 2.4.2 编译器错误检查 2.4.3 清除字节码模块 2.4.4 调试输出说明 2.4.5 使用 trace 函数 2.4.6 使用 dump 函数 2.4.7 使用游戏中的对象浏览器 2.4.8 TorqueScript 源代码调试器 2.5 对象 2.5.1 创建对象 2.5.2 操作对象 2.6 数据块对象 2.6
4、.1 创建数据块对象 2.6.2 数据块的声明 2.7 ScriptObject 2.7.2 使用 ScriptObject 2.8 文件处理 2.8.1 export 语句 2.8.2 文件对象 2.9 使用字符串 2.9.1 标记字符串 2.9.2 转义序列 2.10 本章小结精彩技术文章推荐 一种 2D 游戏引擎的设计与实现 用林登脚本语言实现第二人生脚本编程 策划人员如何产生游戏测试方案 J2ME 专业手机游戏开发基础 使用 NetBeans 进行游戏移植的解决方案 SDL.NET 为 .NET 游戏开发提供跨平台支持 J2ME 开发手机游戏物理模型之抛物线 将 GAPI 游戏从纵向模
5、式移植到方形屏幕 如何做好游戏开发项目基本需求分析 用 VisualBasic.NET 编写扑克牌游戏 浅谈即时战略游戏在 J2ME 上的实现 游戏引擎原理 A 实现“九连环 ”小游戏 Java 手机游戏编程之 MIDP 图形设计篇0.1 关于本书的姊妹篇3D 游戏开发大全如果您尚未看过 3DGPAI1 这本书,那么请允许我先在这里对它简要地的介绍一下:3DGPAI1 可以全面的地教会您如何使用 Torque 游戏引擎开发 3D 游戏。它涵盖了程序设计基础、使用 Torque 引擎进行编程、3D图形学基础、使用 MilkShape 3D 和 QuArK 进行 3D 建模、使用 Audacity
6、 进行音频处理、使用 Paint Shop Pro 进行纹理处理,它还给出了 TorqueScript(Torque 引擎提供的一种脚本语言,译者注)脚本语言的大量使用技巧。尽管 3DGPAI1 已经比较全面的地介绍了关于游戏开发的众多主题,但仍不要奢望那本区区 600 多页的书能够涵盖游戏开发所涉及的全部内容,所以引来一群举着火把的示威者也就不足为奇了。0.2 关于本书这本书将引导您进一步学习,它将涉及许多更难的技术领域:诸如人工智能、动态皮肤以及对游戏引擎运行机制的更深入剖析等。我们还将通过研究 TorqueScript 脚本语言的 goodie-box 来揭示它的实现机制,从而使您的游戏
7、开发水平有一个较大的提升。0.2.1 您需要准备什么学习本书,您需要安装一个合适的计算机操作系统。假定您现在使用的是 Windows XP 系统,当然,您也可以使用其他 Windows 版本。这并不是一本如 3DGPAI1 那样适合初学者学习的书。如果您已经购买了 3DGPAI1,并且在使用它后获得了不错的学习效果,那么您一定也可以在本书中获得同样的体验,当然,这也不是绝对的。1. 技能如果您是一名非常全面的程序员(不管用什么编程语言),或者您有过使用 Valves Hammer 或 3D Max 等工具建模的工作经验,那么您不用参考 3DGPAI1 一书中的基础内容部分,也可以很好地跟上本书
8、。阅读本书时您应该比较熟悉以下计算机相关操作:找到 Windows 文件夹和硬盘上某一位置的路径、使用 Windows 的 shell 命令(cmd.exe)、创建快捷方式和编辑它们的属性。2. 系统 您需要一台基于 Windows 系统的计算机来配合学习这本书(以下给出系统的最低配置要求)。如果您使用的是 Macintosh 或者 Linux 系统,也可以使用本书来制作一款游戏,因为本书中所使用的 Torque 游戏引擎也适用于这些操作系统。但是,并不是所有要用到的开发工具在 Mac 和 Linux 系统下都可用,因此这本书将主要以基于 Intel 系列的 Windows 操作系统作为开发平
9、台。系统需求处理器 最低配置为 Pentium III/800MHz操作系统 Windows 98/ME /2000/XP显卡 三维加速器卡,NVidia GeForce2-32MB 或者更好的显示器 推荐 17 英寸的显示器输入设备 键盘和鼠标内存 最低配置为 128MB,推荐 256MB硬盘 最低配置为 4GB光驱 最低配置为 CD-R并且,我还建议您使用好一点的新型声卡,并且能够使用宽带上网。0.2.2 本书将提供什么为了能使您最大限度地利用好本书,建议购买 Torque 游戏引擎的使用授权,现在您只需付 100 美元就可获得它的使用授权。如果您已获得该授权,就可以去 GarageGam
10、es 网站() 下载最新版本的社区资源,其中包含很多本书没有涉及到的技术。本书所使用的 Torque 版本是 Torque Release v1.3。在您下载 Torque 引擎演示 demo 的网址http:/ Torque Release v1.3 的可执行文件和 demo的代码。本书所有的章节练习都使用了 TorqueScript 脚本语言,但并没有讨论和涵盖任何关于 Torque引擎的核心代码或者集成于该引擎中的 C/C+代码模块。0.2.3 本书附带的 CD本书所附带的 CD 中包含了大量的资源:Torque 引擎及几种自定义构件(custom build)、基于TorqueScri
11、pt 脚本语言的游戏源代码和艺术作品资源、开发工具和使用 Torque 引擎开发的一些游戏的demo 版本。1. 源代码本书附带的 CD 中包含了所有示例和答案的 TorqueScript 脚本代码。示例文件按每章的内容排列,完整demo 的脚本文件都包含在它所在章节的对应文件夹里。2. 游戏引擎本书附带的 CD 中包含一个完整的 Torque 游戏引擎:可执行文件、动态链接库(DLL)、所有需要的 GUI 组件和相关支持文件。Torque 游戏引擎功能全面,具有高级网络通信处理能力,支持动画融合技术,具有内置于服务器端的防作弊能力,支持 BSP 技术,提供一个强大且完全面向对象的脚本语言(类
12、似于 C+),以及许多其他高级功能。3. 工具大多数标准工具集(正如在 3DGPAI1 中所建立的)在本书附带的 CD 中都提供了。尽管我们不可能面面俱到地介绍这些工具的使用细节,但是它们确实可以为您开发游戏带来方便。这些工具包括最新版本的MilkShape 3D、QuArK 和 UltraEdit-32。4. 其它他内容在本书附带的 CD 中,还有一个名为 EXTRAS 的文件夹,它包含了使用 Torque 引擎制作的 demos 和游戏,它们面向 Windows、Macintosh 和 Linux 操作系统。此外, Macintosh 和 Linux 系统下的 Torque 游戏引擎 v1
13、.3 版本中 demo 的安装文件也包含在此。0.3 现在就动手吧!我一直这样告诉人们:如果您想成为一个不因人成事的成功者,则需要对自己正在做的事情投入极大的热情。如果您总是原地不动不停地做那些缺乏热情、斤斤计较、功利而盲目的商业决定的话,就不可能成为一个有所成就的独立开发者。随时随地都会出现一个满腔热情,目光敏锐的家伙准备超越您!那么,现在您应该知道自己该做什么了吧!首先,赶上那个家伙或者和他结成强有力的联盟,以本书所提供的知识作为强大武器,那么机会就是您的啦。第部分 高级脚本编程第 1 章 多目标环境 31.1 TorqueScript 脚本语言 31.2 3D 数学预览 41.3 可玩性
14、 51.4 制作Bots 71.4.1 AI 概念 71.4.2 继续上一个话题 81.4.3 群体动力学 91.5 艺术性 91.5.1 细节 101.5.2 入口 111.5.3 光照 121.5.4 外皮脱卸 121.6 本章小结 13第 2 章 使用 TorqueScript 脚本语言 152.1 Torque 项目的组织 152.2 安装 Torque 162.3 TorqueScript 概览 182.4 问题解决机制 182.4.1 日志 192.4.2 编译器错误检查 202.4.3 清除字节码模块 212.4.4 调试输出说明 212.4.5 使用 trace 函数 222.
15、4.6 使用 dump 函数 232.4.7 使用游戏中的对象浏览器 262.4.8 TorqueScript 源代码调试器 272.5 对象 362.5.1 创建对象 362.5.2 操作对象 372.6 数据块对象 392.6.1 创建数据块对象 422.6.2 数据块的声明 432.7 ScriptObject 432.7.1 创建一个 ScriptObject 442.7.2 使用 ScriptObject 442.8 文件处理 452.8.1 export 语句 452.8.2 文件对象 462.9 使用字符串 472.9.1 标记字符串 472.9.2 转义序列 482.10 本章
16、小结 49第 3 章 向量和矩阵 513.1 向量 513.1.1 向量的定义 523.1.2 向量的用法 573.2 矩阵 643.2.1 使用矩阵的好处 663.2.2 矩阵的用法 663.3 TorqueScript 的应用技巧 703.3.1 一个变换的小程序 713.3.2 旋转 743.4 本章小结 77第 4 章 在 3D 下使用 TorqueScript 794.1 门的旋转 794.1.1 门资源 804.1.2 门的旋转代码 814.1.3 门的旋转操作测试 924.2 门的滑动 944.2.1 门资源 944.2.2 门代码 944.2.3 滑动门的测试 1024.3 w
17、arping 1024.3.1 离开任务区 1034.3.2 准备工作 1034.3.3 脚本代码 1054.3.4 warp 测试 1074.4 本章小结 107第部分 人 工 智 能第 5 章 轻松进入人工智能世界 1115.1 对人工智能的错误理解 1125.2 人工智能的应用领域 1125.2.1 路径查找(searching)和路径规划(routing) 1135.2.2 规则和专家系统 1135.2.3 逻辑和不确定性 1145.2.4 自然语言处理 1165.2.5 神经网络 1165.3 群体思想 1185.4 近期发展趋势展望 1195.5 本章小结 120第 6 章 游戏中
18、的人工智能 1216.1 行为 1216.1.1 感知 1216.1.2 行动 1236.1.3 反应 1236.1.4 学习 1246.2 Bot 的定义 1256.2.1 敌对者 1276.2.2 同盟者 1296.2.3 派别成员 1316.2.4 群体行为 1326.2.5 cheatbot 1336.3 本章小结 134第 7 章 虚拟敌人 1357.1 具有静态行为的 AI 角色 1357.1.1 准备工作 1377.1.2 代码的修改 1417.1.3 aiGuard 模块 1417.1.4 继续研究守卫 1577.2 跟踪路径 1587.2.1 制定一条路径 1587.2.2
19、应用路径 1607.3 追逐 1627.4 本章小结 163第 8 章 AI 交互技术 1658.1 步骤 1658.2 代码 1678.2.1 准备工作 1678.2.2 AITServer 模块 1698.2.3 AITClient 模块 1758.2.4 AITCommands 模块 1808.2.5 AITGui 模块 1838.2.6 AITScript 文件 1868.2.7 AIT 资源 1888.2.8 制作 AIT 脚本 1888.3 AI 角色对话系统的测试 1898.4 本章小结 191第 9 章 群体行为 1939.1 完美的群体 1949.1.1 准备工作 1949.
20、1.2 群体的模块 1969.1.3 代码测试 2029.2 一个追逐群体 2039.3 本章小结 206第部分 强化游戏编程第 10 章 损害控制 20910.1 生命值 21010.1.1 player.cs 脚本模块中的关键特征 21210.1.2 添加能量条 22410.1.3 损害与能量的关联 22610.2 打击位置 22710.3 砰、砰、轰隆隆! 22810.3.1 准备工作 22910.3.2 代码 23010.3.3 惊奇的桶爆炸测试 23710.4 疯狂的巡逻车 23710.4.1 巡逻车的损害处理代码 23710.4.2 巡逻车的爆炸 24010.5 在玻璃房子中生活
21、24210.5.1 准备工作 24210.5.2 代码 24510.5.3 窗户的测试 25210.6 本章小结 253第 11 章 让一切变得更真实 25511.1 现实世界的地形 25611.1.1 DEM 文件格式 25611.1.2 将 DEM 转换为高度图(Heightmap)格式 25711.1.3 Torque 的准备工作 25911.1.4 游戏地形中的高度图 25911.2 植被 26411.2.1 森林 26411.2.2 牧场 26611.3 本章小结 269第 12 章 效果优化 27112.1 士兵身上的光芒 27112.1.1 日升、日落 27412.1.2 制作光
22、晕效果 27812.2 无处不在的水 28112.2.1 水的表现形态 28112.2.2 水的杀伤力 28812.3 水中漫步 29112.4 本章小结 291第 13 章 PHP 创建联机游戏服务 29313.1 PHP 和 Apache 29413.1.1 Apache 的安装 29413.1.2 设置 29513.1.3 安装 PHP 29613.1.4 连接 Apache 和 PHP 29913.2 使用 Web 的游戏内部服务 30013.3 游戏内部的信息抢夺者 30013.4 身份验证 30413.4.1 PHP 身份验证代码 30513.4.2 TorqueScript 代码
23、 30613.5 本章小结 313第部分 强化游戏建模第 14 章 结构建模 31714.1 细节层次 31814.1.1 示范 31814.1.2 细节层次 32214.1.3 实现 32414.1.4 怪兽角色的操作细节 33014.2 实体 33214.2.1 入口 33214.2.2 演示 33314.2.3 创建与放置入口 33414.3 光照 33514.3.1 静态光照 33614.3.2 动画光照 33714.3.3 光照测试 33814.4 本章小结 340第 15 章 形体建模 34115.1 细节层次化 34215.1.1 创建板条箱 34215.1.2 玩家化身 347
24、15.2 本章小结 352第 16 章 可变外皮 35516.1 板条箱 35716.1.1 资源和准备工作 35716.1.2 代码 35816.1.3 使用可变外皮的板条箱 35916.2 一切就绪,预备,出发! 36216.2.1 就绪 36216.2.2 预备 36316.2.3 出发! 36516.3 空闲状态时的外皮变换 36616.3.1 设置 36616.3.2 代码 36616.3.3 Mr.Box 演示 36916.4 本章小结 37016.5 实践! 370附录 A Torque 游戏引擎参考 371A.1 TorqueScript 函数参考 372A.2 Torque
25、参考表 425附录 B 附加资源 445B.1 本书中附加的 TGE Build 代码资源 445B.2 Internet 上的游戏开发资源 445B.2.1 与 Torque 相关的 Web站点 446B.2.2 游戏开发 Web 站点 446B.3 游戏开发工具参考 450B.4 共享软件和免费软件工具 451B.4.1 建模 451B.4.2 程序编辑 452B.4.3 音频编辑 452B.4.4 其他 452B.5 零售工具 453B.6 GNU 一般公众许可证 454第一章 多目标环境在我的第一本书 3D 游戏开发大全中,我们曾经对 3D 游戏开发完成了一次犹如探索原始丛林般的旅程:
26、首先,我们对 3D 游戏产业进行了初步了解;接着,在编程和三维概念上小试牛刀;随后,我们开始在 Torque 这个广袤的大草原上阔步前进,使用 Torque 引擎开发了一些简单的单玩家游戏环境;顺道,我们还经过了用游戏艺术手法(模型和纹理)创作的翠绿森林。在整个神奇的探索之旅中,我们对游戏开发的理解逐渐明晰起来,对 Torque 如何帮助我们初步开发游戏也有了更好的认识。经过这一旅程,我们了解了 3D 游戏开发的各个方面,并仔细探究了在 3D 游戏开发道路上可能遇到的一些问题。 然而,到目前为止,我们只是对所遇到的很多特性和概念匆匆一瞥,未能深究。毕竟游戏开发之旅的沿途风景这么美丽多饶,每一处
27、都让人应接不暇,面面俱到也就是面面不到。所以,在接下来的几章中,我们将故地重游某些地方并进行更深入的探索,以期学习更多的知识,从而形成全面的认知和理解。1.1 TorqueScript 脚本语言当今流行的游戏引擎(包括 Torque),其最主要的技术就是它们的脚本化能力。从某种意义上说,游戏引擎就是包括诸如渲染器、资源管理器以及物理规律模拟等可支持技术的一个集合。游戏脚本相当于粘合剂,把这些技术紧密结合在一起,创建出一个可以有效运行的游戏环境。本书第 I 部分将进一步介绍TorqueScript 的更多相关内容,以及如何在游戏开发环境下应用 TorqueScript。在游戏开发中常常用到脚本,
28、因为脚本允许即时创建代码,可以实现管理和控制游戏引擎或形式化游戏规则等功能,而无需程序员重新编译程序代码去测试它们。在 Torque 中,修改或者添加脚本是相当简单的操作,只要告诉 Torque 重新加载脚本,立即就可以看到相应的结果。当我们向 Torque 加载脚本时,如果不存在该脚本的编码版本或者脚本的源码版本新于当前的编码版本,Torque 会自动将脚本重新编译成基于字节编码的 p-code 编码形式。下面就是一个 TorqueScript 源代码的简短示例:if (%obj.getState() $= “Dead“)return;%obj.applyDamage(%damage);%l
29、ocation = “Body“;%client = %obj.client;%sourceClient = %sourceObject ? %sourceObject.client : 0;if (%obj.getState() $= “Dead“)%client.onDeath(%sourceObject, %sourceClient, %damageType, %location);return; TorqueScript 是一种相当灵活的语言。它在很大程度上提供了现代编程语言的几乎所有特性和功能。它将基于对象的范式及过程化方法与语法完美的地结合在一起,精通 C/C+的人非常熟悉这种模式
30、,很容易上手。数据块及其工作方式是 Torque 引擎中最重要的一个概念。TorqueScript 提供了对数据块的内部支持。Torque 引擎通过 TorqueScript 展现了大量的内在功能。我们在本书中所编写的全部程序都是使用TorqueScript 语言完成的。1.2 3D 数学预览在 3D 游戏中,数学一个很重要的功能就是可以综合利用运动对象的当前位置、欲移动的距离、欲移动的速度以及将要移动的方向,来计算对象将到达的位置在 3D 空间中的坐标值。在大多数情况下,向量是用于解决从出发地到目的地之间的移动问题的有效数学工具。图 1-1 以概念的形式展示了如何使用向量来导航路径穿越有障碍
31、的地带。我们可以看到,帆船只要按照AB,BC,CD 这一向量顺序,它就可以顺利穿过障碍物。我们可以通过定位安全的转弯点来确定每一个新向量,然后计算出所需的向量。当我们告知帆船某个向量时,其实就是让帆船在某一确定的方向上航行一段时间。在几何学中,向量只有位移和方向两个属性,它并没有被限定为空间中的某一个具体的位置。也就是说,我们可以使用同一个向量对某个对象的任一点或任一顶点施加相同的操作,从而获得不同的结果。在这里请大家注意,这些结果存在着一定的关联性。在数学上,它们是相关联的,因为它们都使用了同一个向量。应用向量前,它们在空间上是相关联的,因为在每种情况下所使用的向量完全相同。图 1-2 展示
32、了对三角形的 3 个顶点都使用相同的向量进行操作的情形(带箭头的虚线)。请注意,灰线所示的三角形和原来的三角形具有相同的形状。它只是移动了一下位置而已。图 1-1 使用向量进行导航 图 1-2 使用同一个向量 3 次 事实上,向量是一种特殊形式的矩阵单列矩阵。在第 3 章对向量进行更深入探讨的时候,我们会更详细地介绍矩阵。Torque 提供了支持向量数学和解决您可能遇到的所有向量相关问题的内置函数。 1.3 可玩性制作一款有趣好玩的游戏需要涉及很多方面的知识。每一款游戏所表现的可玩性对它的成功与否有着相当大的影响。很多时候,游戏的某一个好玩之处就是使它脱颖而出的关键所在。最初 Delta Fo
33、rce 游戏中的“一弹毙命”特性就是这方面一个很好的示例。在此版本之前,第一人称射击者游戏更倾向于通过积累生命值(hit point),直到对一个游戏角色造成足够损害的时候才使其致死。而现在,玩家可以手握狙击步枪躲进山里,对出现的敌人予以致命一击。杀伤力 正如您刚刚看到的,有些游戏可以评估出游戏角色的总损害值,但是也有很多游戏倾向于评估玩家角色某一具体部位的损害值,比如:胳膊的受伤次数、头被击中的次数等。我们可以使用 Torque 的内置功能来确定命中位置并以此提供更为精确的损害评估形式。图 1-3 展示了一个怪物模型,它位于以白色边框勾勒的碰撞盒中。图 1-3 玩家模型的碰撞盒 Torque
34、 可以帮助我们计算出模型上被击中部位的精确位置。这一概念还可以应用于其他对象上,试想一下树叶和树枝被击落时的情景吧。我们还将展示如何在虚拟世界中做个快乐的纵火狂,爆炸、火烧汽车只当是在晴朗夏日午后打发无聊的趣事罢了。当然,现实世界中的一切事物都并没有真的被破坏掉。我们可以设想,那些在游戏中作为您练习射击的对象模型将是多么的倒霉!如果没有窗户粉碎的音效,游戏又怎能称得上完整呢?图 1-4 展现了一个粗暴的怪兽肆无忌惮地挥动它的巨弩发射爆破弹对大厅大肆破坏的场景。图 1-4 大厅里残破的窗户1.4 制作Bots人工智能(Artificial Intelligence,AI)是一个很大、很宽的主题。
35、我们通常只关心由计算机控制的游戏角色及其行为,这也是本书第 II 部分的主题。AI 技术在游戏开发的一些特定领域中已经取得了很好的理解和运用。并且,还有一些领域处在应用 AI 技术最前沿的位置上,至少是游戏背景方面的最前沿。不同的游戏流派或社团在讨论 AI 时,对它的表述存在着一些细微的差别。通常,我们使用术语 AI。然而,很多动作类游戏采用术语 bots 或者bots(在字母 b 前增加一个单引号),这是单词 robots(机器人)的一种缩写形式。然而,在另外一些场合,尤其是角色扮演类游戏中,他们更倾向于使用术语 NPC(Non-Player Character,非玩家控制角色) 在游戏情节
36、中不受玩家控制的人物角色(见图 1-5)。图 1-5 Bots 计划它们下一步的移动 还有一个术语是怪物(monster)。其实,把一些由计算机控制、负责守卫秘密设备的士兵人物称为怪物是件非常奇怪的事情,但是有些人就是喜欢这样的称谓,我们也没有办法。这种叫法源于诸如 Doom 和Commander Keen 这样的老牌游戏,在这些游戏中,他们使用了 AI 怪物这个词语。并且,他们称那个在游戏过关前必须要去击败的大怪物为 Boss。虽然这些称谓看起来似乎已经过时,但是现在人们仍然在使用它们。1.4.1 AI 概念计算机控制的 AI 模拟人物角色时,通常需要模拟 3 种不同的行为模式:感知(per
37、ception)、行动(action)和反应(reaction)。有必要将游戏世界里 AI 角色周围环境的各种变化通知给 AI 角色。如果做到这些,就可以帮助 AI 角色感知其周围的环境以及正在发生的事件。在这里,您必须明白一点:您的 AI 角色只能感知您通过编程告诉它的情况。我们可以通过编程使 AI 角色能四处侦察是否有玩家出现。但是,除非您通过编程使其能够感知飞来的火箭即将落到它的身边需要躲避,否则,不管您如何向它射击,它都不会知道自己正身处险境。在游戏中,当需要直接对 AI 角色进行控制的时候,尤其是指挥角色前往某一特定目的地时,我们可以使用路径跟踪技术。正如图 1-6 所示,Torqu
38、e 提供的可视化工具可以方便地设定我们的 AI 角色将要行走的路径。在图中,路径用 a、b、c、d 和 e 标出(a 标签因为被另一个对象挡住而呈灰色)。图中的路径用一个由许多点组成的曲线环表示。图 1-6 World Editor 中的一条 AI 路径 对于bot 来说, 行动是指执行特定任务或任务序列的能力。一个简单的任务可以是从某个位置移动到另一个位置,也可以是向敌人开火。作为游戏程序员,我们的目标是教会或者说是通过编程让 AI 角色完成适量的简单任务。然后,将这些简单任务高效地组合成大型的复杂任务,再将这些稍微大型的复杂任务组合成规模更大的复杂任务,以此类推,直到获得我们希望它表现出的
39、效果。反应指的是 AI 角色根据对状态或事件的感知而做出适当行为的一个过程。参见我们上面所举的示例 1,如果我们通过编程使 AI 角色能够感觉到或感知到自己正在被攻击,那么我们同样也可以通过编程让其表现出相应的反应,比如逃跑、还击或者发出野兽般的嚎叫。1.4.1 AI 概念计算机控制的 AI 模拟人物角色时,通常需要模拟 3 种不同的行为模式:感知(perception)、行动(action)和反应(reaction)。有必要将游戏世界里 AI 角色周围环境的各种变化通知给 AI 角色。如果做到这些,就可以帮助 AI 角色感知其周围的环境以及正在发生的事件。在这里,您必须明白一点:您的 AI
40、角色只能感知您通过编程告诉它的情况。我们可以通过编程使 AI 角色能四处侦察是否有玩家出现。但是,除非您通过编程使其能够感知飞来的火箭即将落到它的身边需要躲避,否则,不管您如何向它射击,它都不会知道自己正身处险境。在游戏中,当需要直接对 AI 角色进行控制的时候,尤其是指挥角色前往某一特定目的地时,我们可以使用路径跟踪技术。正如图 1-6 所示,Torque 提供的可视化工具可以方便地设定我们的 AI 角色将要行走的路径。在图中,路径用 a、b、c、d 和 e 标出(a 标签因为被另一个对象挡住而呈灰色)。图中的路径用一个由许多点组成的曲线环表示。图 1-6 World Editor 中的一条
41、 AI 路径 对于bot 来说, 行动是指执行特定任务或任务序列的能力。一个简单的任务可以是从某个位置移动到另一个位置,也可以是向敌人开火。作为游戏程序员,我们的目标是教会或者说是通过编程让 AI 角色完成适量的简单任务。然后,将这些简单任务高效地组合成大型的复杂任务,再将这些稍微大型的复杂任务组合成规模更大的复杂任务,以此类推,直到获得我们希望它表现出的效果。反应指的是 AI 角色根据对状态或事件的感知而做出适当行为的一个过程。参见我们上面所举的示例 1,如果我们通过编程使 AI 角色能够感觉到或感知到自己正在被攻击,那么我们同样也可以通过编程让其表现出相应的反应,比如逃跑、还击或者发出野兽
42、般的嚎叫。1.4.1 AI 概念计算机控制的 AI 模拟人物角色时,通常需要模拟 3 种不同的行为模式:感知(perception)、行动(action)和反应(reaction)。有必要将游戏世界里 AI 角色周围环境的各种变化通知给 AI 角色。如果做到这些,就可以帮助 AI 角色感知其周围的环境以及正在发生的事件。在这里,您必须明白一点:您的 AI 角色只能感知您通过编程告诉它的情况。我们可以通过编程使 AI 角色能四处侦察是否有玩家出现。但是,除非您通过编程使其能够感知飞来的火箭即将落到它的身边需要躲避,否则,不管您如何向它射击,它都不会知道自己正身处险境。在游戏中,当需要直接对 AI
43、 角色进行控制的时候,尤其是指挥角色前往某一特定目的地时,我们可以使用路径跟踪技术。正如图 1-6 所示,Torque 提供的可视化工具可以方便地设定我们的 AI 角色将要行走的路径。在图中,路径用 a、b、c、d 和 e 标出(a 标签因为被另一个对象挡住而呈灰色)。图中的路径用一个由许多点组成的曲线环表示。图 1-6 World Editor 中的一条 AI 路径 对于bot 来说, 行动是指执行特定任务或任务序列的能力。一个简单的任务可以是从某个位置移动到另一个位置,也可以是向敌人开火。作为游戏程序员,我们的目标是教会或者说是通过编程让 AI 角色完成适量的简单任务。然后,将这些简单任务
44、高效地组合成大型的复杂任务,再将这些稍微大型的复杂任务组合成规模更大的复杂任务,以此类推,直到获得我们希望它表现出的效果。反应指的是 AI 角色根据对状态或事件的感知而做出适当行为的一个过程。参见我们上面所举的示例 1,如果我们通过编程使 AI 角色能够感觉到或感知到自己正在被攻击,那么我们同样也可以通过编程让其表现出相应的反应,比如逃跑、还击或者发出野兽般的嚎叫。1.4.2 继续上一个话题在本书中,我们还将通过编写程序让 AI 角色具备更逼真的智能,让它们可以在游戏世界里自己寻路、感知游戏世界里的事件、时刻保持对玩家角色的警觉性、对威胁和事件作出恰当的反应。我们可以依赖于 Torque 对
45、AI 的内置支持功能,但这还远远不够。所以需要自己编写符合要求的行为脚本。若把握好了这一点,就可以看到非常有趣的突发行为bots 会做出一些出乎意料的行为。图 1-7 展示了由非常简单的 AI 脚本控制的两个奇幻生物在互相攻击。图 1-7 Bots 间的自适应攻击 1.4.3 群体动力学很多类型的游戏都会向玩家提供一群由计算机控制的 AI 角色,它们要么与玩家同一战线,要么是玩家的死对头,成为阻挡玩家前进的障碍。有时由计算机控制的 AI 角色只是用于营造游戏气氛。比如,让一群海鸥围绕海上航行的船只盘旋。在游戏环境中,需要对各种群体类型进行建模,比如蜂群、羊群、牧群及兽群等。我们会在第 II 部
46、分对有关概念进一步展开介绍,并编写几个脚本示例以说明它们的工作原理,如图 1-8 所示。图 1-8 群聚 1.5 艺术性 在游戏开发中,我们不能在游戏的艺术性方面敷衍了事。3D 游戏开发大全一书虽然在关于艺术制作与建模的几章中介绍了几个关于游戏艺术性的主题,但那些介绍并不全面。本书的第 III 部分将对此进行一些调整和补充。请大家注意一下,本书并没有提供艺术制作工具的相关使用教程。但是,您可以在本书附带的 CD 上找到相关软件的共享版或者免费版。这样,您还是可以很方便地使用这些工具完成要做的工作。如果您不知道如何使用这些工具,则可以参阅3D 游戏开发大全一书来配合本书的学习。1.5.1 细节在
47、降低游戏客户端渲染器的载入时间上,有一种灵活有效的平滑机制可供游戏开发者使用,称为细节层次化技术(LOD)。LOD 和 MIP 贴图的概念很相似。MIP 贴图是一种纹理贴图方法,它将原始的高分辨率纹理经过缩放和过滤,使其分辨率增加数倍,然后再贴图到模型面上。使用 LOD 时,可以为一个模型制作多个版本的模型文件,而各个层次的模型文件所使用的多边形随层次的降低依次减少。LOD 的基本思想:随着与模型的距离越来越远,将会出现两种情况:第一,我们离建筑物这类物体越远,可能出现在视野中的建筑物就可能越多,这就需要绘制更多的多边形,并且会加重渲染器和显卡的负担; 第二,向远处后退的建筑物的细节部分将会越
48、来越模糊。图 1-9 显示了建筑物模型的完整细节层次的和两个稍微降低层次的 LOD 版本。注意,最低层次的 LOD 版本居然只是一个盒子!图 1-9 建筑物的各种细节层次化效果 通过 LOD 切换技术,我们可以利用第二种现象去最小化甚至完全消除第一种情况所带来的副作用。当我们远离建筑物时,游戏引擎将自动检测进入我们视野中的建筑物的大小。当建筑物的大小超过某一极限时,引擎就会停止渲染当前模型的完全细节层次化版本,并改为去渲染其稍低层次的细节层次化版本。它会监视模型外观大小的变化直到它达到下一个极限,如此进行下去。我们可以一直这样使用细节层次化技术,直到建筑模型的大小变为远方的一个像素点为止。同样
49、,我们可以将 LOD 技术应用于所有模型上玩家角色、光源、车辆、树木以及其他物体。1.5.2 入口当给建筑物的内部结构建模的时候,可以使用入口(portal)(见图 1-10)帮助引擎判断哪些地方需要绘制,而哪些地方可以忽略。 图 1-10 一个城堡内部的入口 入口提供了加速渲染和提高游戏帧频率的另一种方法。它也提供了一种帮助控制内部场景光照的机制。图 1-10 显示了如何使用入口将一个内部场景划分为多个区域(又称单元格)。图中玩家从房间所看到的场景就是一个区域,其中靠右的楼梯间里也划分了两个区域,而整个大房间的窗外空间又是一个区域。在图 1-11 中,入口用 CSG 画笔所绘出的粗黑线条表示。在 CSG 术语中,画笔是凸起的 3D 形状。图 1-11 一个建筑物内部模型中的入口 当模型源文件被编译为与 Torque 引擎兼容的格式时,编译器会计算出哪些区域将对其