在游戏开发中,应用正确的物理定律可以逼真地模拟游戏中任何弹跳、飞行、翻滚、滑行或非静止的物体,以建立令人注目且真实的游戏、动画内容。
本书从基础讲起,借助形象的范例程序,介绍了如何在游戏开发中加入物理真实性并丰富游戏内容,使游戏更加灵活生动。全书共分三部分。第一部分是复习基本概念及讨论刚体动力学的机械力学初级课程;第二部分将这些问题应用到现实生活的问题上,例如抛射体、船舰、飞机和汽车;第三部分介绍即时模拟器并示范了如何将其应用到游戏开发中。
对于希望增加物理真实性的游戏开发人员,本书乃绝佳的参考书。
前言 1
第一章 基本概念 9
牛顿运动定律 9
单位与计量 10
坐标系 12
向量 13
质量、质心与转动惯量 13
牛顿第二运动定律 23
惯性张量 27
第二章 运动学 32
简介 32
速度与加速度 33
定加速度 35
不定加速度 37
2D粒子运动学 38
3D 粒子运动学 40
粒子爆炸的运动学 50
刚体运动学 55
局部坐标轴 56
角速度及加速度 57
第三章 作用力 63
简介 63
力场 64
摩擦力 65
流体动阻力 66
压强 68
浮力 68
弹簧和阻尼 70
力与力矩 71
第四章 动力学 75
2D的粒子动力学 76
3D粒子动力学 81
刚体动力学 88
第五章 碰撞 93
冲量/动量定律 94
撞击 95
线性及角冲量 100
摩擦力 103
第六章 抛体 106
基本的抛体轨道 107
阻力 111
马格那斯效应 118
变动质量 123
第七章 飞机 125
几何形状 127
升力与阻力 128
其他的作用力 133
控制 134
飞行模拟 135
第八章 船舰 149
漂浮 150
体积 152
阻力 162
虚质量 164
第九章 气垫船 166
运作原理 166
阻力 168
第十章 汽车运动 171
阻力 171
功率 172
刹车距离 173
道路边坡 174
第十一章 即时模拟 176
运动方程的积分 177
欧拉法 178
其他的方法 184
第十二章 2D刚体模拟器 188
模型 189
积分函数 195
飞行控制 198
绘图 202
第十三章 碰撞反应实现 209
线性碰撞反应 210
角运动 215
第十四章 刚体的转动 227
旋转矩阵法 228
四元数法 231
第十五章 3D刚体模拟器 233
模型 234
积分函数 238
飞行控制 241
绘图 245
第十六章 3D多重物体模拟 252
模型 253
积分函数 267
碰撞反应 269
参数调整 272
第十七章 粒子系统 274
模型 274
积分函数 284
碰撞反应 285
参数调整 286
附录一 向量的运算 289
附录二 矩阵的运算 299
附录三 四元数的运算 308
参考文献 319
索引 325
简单地说,本书是专为没有扎实的力学和物理背景、却负责要在游戏中加入物理模拟的电脑游戏设计师而设计的。
身为游戏设计师或者电脑玩家,你也许曾经见过号称“超真实”或“写实”的产品。同时,你或公司的营销部门,也许正在考虑如何在产品中添加物理的真实度。
或许你想要做些全新的尝试,去探索真实的物理学。但问题是你早在期末考试之后就将物理的教材抛入湖中,而且之后从未再接触此领域。也许你买了一套相当酷的物理引擎,但是却不了解其中运作的原理或执行模拟时此引擎的影响。或者也许你要负责调整其他人所的物理学程序代码,但是你却不清楚其运作的原理。这表示你该阅读本书了。
当然你可以搜寻网络、专业期刊和杂志获得相关资料与指引,让游戏能加入物理的真实性。你也可以由旧物理教材中重新开始。然而你也许会发现,这些资料或者由于太过广泛而不适于直接应用,或者由于难度太大而需要搜寻其他资料以先打好基础。本书将搜集所有需要的资料,作为你(游戏设计师)加入物理真实性以丰富游戏内容的出发点。
本书并不只是针对各式各样的问题提供不同的范例程序而已。网络中已经充斥太多这类的范例程序(当然也包括一些非常好的程序)。除了对某些问题提供解答之外,本书的目的是要让读者对于相关领域能有彻底而基础性的了解,进而对于其他的问题开发出自己的解决方案。本书将详细地解说运用在游戏开发领域的物理学原理,除了范例程序外,还将用手写的计算范例进行补充说明。
读者应有的基础
虽然读者并不一定都要是物理专家,不过非物理或工程学系的读者至少要有大专程度的基础物理学知识。你不必将物理学背景谨记在心,因为本书前几章会讲解与游戏物理相关的主题。
读者必须精通三角函数、向量和矩阵数学,在附录中也会提供这些领域的参考资料。此外读者需要有大专程度的基本微积分知识,包括对显式函数(explicitfunction)的积分与微分。数值积分与微分又是另一个领域,在本书的稍后几章将会详细地介绍这些技巧。
力学当我构思本书的概念时,与人交谈当中若提及“真实物理学”或“即时模拟”这些名词,这些人通常立刻会想到飞行模拟程序。顶尖的飞行模拟当然与本书的内容有关;然而许多不同类型的游戏和特定游戏的元素,也能从物理的真实度增加几分可玩性。
想想以下这个范例:你正在做一个轰动的射击游戏,游戏中有第一人称的3D画面、华丽的贴图和令人震撼的音效,但是却缺少某个元素。这个元素就是真实度。具体地说,你希望通过挑战玩家的射击技术让游戏感觉更真实,要实现这个目标,就要加入某些考量,如与目标之间的距离、风速和方向、枪口速度等。你不必虚构这些元素,可以根据物理原理来模拟这些元素的物理特性。任职于MathEngine Plc的Gary Powell这么说:“虚拟世界的图像和令人沉迷的体验、以精密的多边形精心建立的模型、复杂的贴图和先进的光源投影,当物体开始移动和互动时通常是令人震惊的。”(注1)“这完全是互动性和吸引力”,avok.com的CEO Steven Collins博士这么说(注2)。我认为这些人都找对了方向。为什么在增加游戏世界的真实性上耗费这么多时间和精力,而不再多走几步让游戏中的动作更真实呢?
以下是可利用物理学增加真实度的游戏元素的例子:
火箭和导弹的飞行轨迹,包含燃料消耗的影响。
物体(例如撞球)之间的碰撞。
大型物体(例如星球和太空堡垒)之间的万有引力作用。
赛车急转弯时的稳定性。
船或浮于水面的交通工具的动力学。
棒球被球棒击打出去的飞行路径。
被丢进帽子的纸牌的飞行路径。
这绝不是一个完整的清单,而仅仅是一些提供正确概念的例子。游戏中有许多弹跳、飞行、翻滚、滑翔或非静止的物体,可真实地模拟以创造吸引人的、可信的游戏内容。
如何实现这样的真实性呢?当然,说到物理学原理,就要回到本节的标题:力学。
物理学是一门领域极广的科学,包含许多不同却相关的领域。在真实游戏内容中最常使用的主题是力学,这也就是“真实的物理学”所代表的意义。
力学在定义上研究物体在静止或运动时作用在其上的力的影响。因此力学可分为静力学与动力学,前者特别注重对物体处于静止状态的研究,而后者则研究物体的运动状态。物理学中最古老且最常被研究的领域 —— 力学的起源,可追溯到2000年前亚里斯多德的时代。此领域另一个更早的论述为“Problem of Mechanics(力学的问题)”,但是这个作品的起源无法考证。虽然某些早期的研究让物理现象变成魔术领域,但是伟大的物理学家如伽利略、开卜勒、欧拉、拉格朗治、达朗贝尔、牛顿、爱因斯坦等的不懈努力,使人们对物理学的了解能发展到今天这种程度,让我们目前所见技术先进到惊人程度。
为了使游戏能生动活泼并栩栩如生,我将把重点放在运动中的物体上,并钻研此领域的力学。在力学的领域中,还有许多特定的领域需要研究。例如运动学将重点放在物体的运动而不是作用在物体上的力上。而动力学同时注重物体的运动和作用在物体上并影响物体运动的力。本书中将详细探讨这两个主题。
章节编排
物理真实在游戏界中并不是个新事物;事实上,销售的许多游戏都以物理引擎为核心。许多3D模型和动画软件也有内建的物理引擎,能写实地画出特定的动作。自然而然地,杂志上的文章时常出现讨论各种物理式游戏的内容。同样,在另一个层次,对于即时刚体(注3)模拟的研究已经有好几年了,而技术期刊也充满了这类处理不同问题的论文。这个主题的论文范围从多重、相连刚体的模拟到布料的模拟。然而正如之前所述,虽然这些都是吸引人的主题和有价值的资源,对于游戏开发人员而言要直接使用却是有限制的。因为游戏开发人员必须要对这些领域的力学有完整的认知,还要学习其他资源的基础。况且,其中大多的重点主要放在解运动方程的数学上,并未真正处理作用在模拟中的物体或系统上的力。我问过在Animats工作的John Nagle,在开发以物理为基础的模拟游戏时,对他而言哪个部分是最困难的。他的回答是开发数值稳定且健全的程序代码(注4)。Gary Powell对此发表回应,他告诉我说:最小化对产品稳定度与真实行为的参数调整所需的成本是最困难的挑战之一。我同意关于处理物体动作的数学要使其速度和稳定兼具是模拟器最困难的部分。保持模拟程序在初始及进行中作用力的完整性和正确性也是如此。稍后在本书中就可以看到,作用力会控制模拟程序中物体的行为。如果想让物体有真实的行为,就要正确地模型化物体。
对于力学的必要认知和在真实世界中会作用于特定物体上的作用力,都会影响本书的编排方式。
第一章至第五章基本上是力学的基础课程,并且由复习基本概念开始,再慢慢地建立刚体力学更具挑战性的概念。这几章的目的是提供充足的力学复习课程,让你可以阅读更多进阶的文章。如果你对于力学已经相当熟悉,可以略过这些章节直接阅读第六章。
第一章:基本概念
本章是热身的章节,内容包含一些最基础的定理,可作为本书其他章节的参考。将会提到的主题包括质量和质心、牛顿运动定律、惯性、单位与度量和向量。
第二章:运动学
本章的主题有线性速度与角速度、加速度、动量,以及2D及3D环境中粒子与刚体的一般性运动。
第三章:作用力
本章包括力与力矩的原理,可以作为由运动学的范畴跨入动力学范畴的桥梁。会讨论一般种类的作用力,包括阻力、力场和压力。
第四章:动力学
本章结合第二章与第三章的元素,介绍运动学的主题和解释动力学与运动学之间的差异。关于粒子与刚体的动力学,在2D及3D环境中将进行更进一步的讨论。
第五章:碰撞
本章包含粒子与刚体的碰撞反应,也就是两物体在相互碰撞后会发生什么事情。
第六章至第十章开始介绍真实世界中的一些问题。这些章节的重点在于模型化某些实体系统、尤其是其中涉及的作用力,并给予你健全的知识,因此系统能正确地在即时模拟器中模型化。这个部分的范例并没有完全包括所有可能在游戏中会模拟的系统。选择这些系统是来解释某些和广泛的问题有关的物理现象和概念。
第六章:抛体
由第六章开始的一系列章节,介绍可能在游戏模拟时遇到的问题,并提供实际上可行的内容。本章的主题是抛体,讨论在抛体飞行中所受的力,以及影响俣扔牍旒?的因素。
第七章:飞机
本章的重点是飞行的要素,包括推进力、阻力、几何形状、质量以及最重要的升
力。本章同时也是实现3D即时模拟器的起点,这个模拟器的实现将在第十五章进行介绍。
第八章:船舰
本章讨论排水型船舰的基本元素,包括浮力、稳定度、体积、阻力和速度。
第九章:气垫船
气垫船同时有飞机和船的特性。本章讨论独特的交通工具——气垫船——的特性。包含的主题有盘旋飞行、空气静升力和方向控制。
第十章:汽车
本章将讨论汽车某些方面的性能,包括空气阻力、滚转阻力、滑行距离和道路边坡等。
第十一章至第十七章和3个附录,将介绍即时模拟程序。这些章节会介绍即时模拟器,并讨论在这个领域中可以应用在电脑游戏上的不同方面。即时模拟器的主题是非常广泛的,必须用一本书的篇幅才可能介绍,所以本书只介绍其中的基础。我将带领你实现一个有两艘气垫船的2D模拟器、3D的飞行模拟器、有碰撞反应的3D多重物体模拟器,以及使用粒子和弹簧的柔体模拟器。
第十一章:即时模拟
本章介绍的主题是即时模拟,包含一些用来解运动微分方程的数值积分法。
第十二章:2D刚体模拟器
本章会介绍实现简单的2D粒子和刚体的模拟器的实用面。本章还将实现有两艘气垫船的简单即时模拟器。
第十三章:实现碰撞反应
本章将示范如何在即时模拟器中实现第五章所讨论的碰撞反应。具体地说,就是在第十二章开发的气垫船模拟程序中加入碰撞反应。
第十四章:刚体旋转
在进入3D模拟器之前,要先介绍在3D环境中表现刚体旋转方位会遇到的问题。这里会考虑欧拉角、旋转矩阵和四元数。
第十五章:3D刚体模拟器
本章结合了第十一章至第十四章中所讨论的内容,并介绍在实现简单的3D刚体模拟器时的实用面。这里将介绍如何根据第七章介绍的空气动力模型来开发简单的飞行模拟器。
第十六章:3D多重物体模拟
本章拓展在第十五章所介绍的范例程序,并处理在3D环境中多重物体在碰撞侦测和反应方面的能力。这里介绍的范例由一辆汽车和一对测试碰撞方块组成。
第十七章:粒子系统
本章示范可以用简单的粒子模拟系统来做什么。具体而言,本章介绍使用系统化的粒子和弹簧组成仿真的布质。这个模拟程序模拟一个旗子挂在旗杆上时迎风飘扬的样子。
附录一:向量运算
本附录介绍如何实现C++的类,此类包含所有在2D和3D模拟程序中会用到的向量运算。
附录二:矩阵运算
本附录实现一个类,包含所有需要用来处理3×3矩阵的运算。
附录三:四元数运算
本附录实现一个类,此类包含所有在3D模拟程序中处理四元数时会用到的运算。
了与即时模拟有关的资源外,在书后的参考文献中也提供关于力学、数学,以及与其他某些技术主题(例如空气动力学的书籍)有关的资料。
排版约定
以下是本书使用的排版体裁:
等宽字体(Constant width)用来表示命令模式的电脑输出、范例程序代码和键盘快捷键。等宽斜体(Constant width italic)用来表示在范例程序代码中的变量。斜体字(italic)用来介绍新名词和表示URL、变量、文件名和目录、命令和扩展文件名。粗体字(Bold)
用来表示向量变量,以及一些物理名词。
建议与评论
本书的内容都经过测试,尽管我们做了最大的努力,但错误和疏忽仍然是在所难免的。如果你发现有什么错误,或者是对将来的版本有什么建议,请通过下面的地址告诉我们:
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
100080北京市海淀区知春路49号希格玛公寓B座809室
奥莱理软件(北京)有限公司
O'Reilly的每一本书都有专属网页,你可以在此找到关于该本书籍的相关信息,包括范例程序的下载、勘误表与相关资源的链接:http://www.oreilly.com/catalog/physicsgame/。
要评价本书或询问有关技术问题,请发电子邮件到:bookquestions@oreilly.com,info@mail.oreilly.com.cn。
要了解更多有关书籍、会议、资源中心和O'Reilly Network的信息,请参见O'Reilly的Web站点:http://www.oreilly.com,http://www.oreilly.com.cn。
致谢
我要感谢本书编辑Robert Denn,因为他对我的著作给予了熟练的检阅和有深刻见解的评析和建议,更不用提他的耐心了。我也要感谢O'Reilly同意我这个计划,给我机会能实行这个长久以来的点子。此外还要特别感谢所有O'Reilly的产品与技术人员。
还要感谢MathEngine Plc的Gary Powell、Havok.com的Steven Collins博士和Animats的John Nagle。因为他们专业的评论和回答我许多对于游戏物理和即时模拟器的问题。我不能忘记技术审阅Sam Kalat、Mike Keith和Michelle McDonald,以及他们完整与卓越的评析和建议。同样要特别感谢我的商业伙伴兼长久的朋友Glenn Seemann,他带领我开始电脑游戏的研发。最后我想要感谢我亲爱的妻子,也是最好的朋友Helena,与她无尽的支持和鼓励,和我们的小女儿Natalia,谢谢她让每一天都特别。