《游戲物理引擎開發(fā)》詳細闡述了與游戲物理引擎相關(guān)的高效解決方案及相應的數(shù)據(jù)結(jié)構(gòu)和算法,主要包括粒子數(shù)學、運動定律、粒子物理引擎、合力、彈力、硬約束條件、質(zhì)體物理引擎、旋轉(zhuǎn)操作的數(shù)學知識、剛體運算定律、剛體物理引擎、碰撞檢測、生成碰撞、碰撞處理方案、靜態(tài)接觸和摩擦力、穩(wěn)定性和優(yōu)化問題、整合方案以及其他物理引擎等內(nèi)容。此外,本書還提供了相應的算法、代碼以及偽代碼,以幫助讀者進一步理解相關(guān)方案的實現(xiàn)過程。
《游戲物理引擎開發(fā)》適合作為高等院校計算機及相關(guān)專業(yè)的教材和教學參考書,也可作為相關(guān)開發(fā)人員的自學教材和參考手冊。
本人于20世紀80年代踏上游戲編程之路,當時正是8位機風行的年代,低預算與較短的開發(fā)周期鼓勵研發(fā)人員不斷嘗試和創(chuàng)新,其中不乏某些游戲精品。至今,我依然對兩款游戲印象深刻,它們均采用了真實的物理行為作為游戲體驗的核心內(nèi)容。
第一款游戲由Jeremy Smith開發(fā),并針對英國BBC Micro家用計算機平臺而發(fā)布,即Thrust。該游戲根據(jù)街機游戲Gravitar改編,其中藤葉狀船只游弋于地下溶洞之間,且通過2D物理模擬對其加以支配。游戲任務是竊取大型燃料棒,并通過線纜連接至船體。隨后,相對簡單的船體模型演變?yōu)閮蓚大型對象之間的交互行為。游戲本身頗具挑戰(zhàn)性且令人欲罷不能,因而不失為一款經(jīng)典游戲。
第二款游戲則是Exile,由Peter Irvin和Jeremy Smith聯(lián)袂開發(fā)。該游戲具有一定的創(chuàng)造性且令人印象深刻,游戲所蘊含的技術(shù)亮點已超出了物理范疇,例如游戲?qū)ο蟮倪^程式構(gòu)建方式。
游戲Exile中的物理內(nèi)容體現(xiàn)于游戲中的各個對象上。其中,發(fā)射物沿彈道軌跡行進;玩家可投擲手榴彈,且爆炸沖擊波可掀翻周圍物體;玩家可負重前行且身體呈彎曲狀態(tài);另外,玩家還可漂流于水面上。總之,游戲Exile首次采用了相對完整的物理引擎。
盡管游戲Exile發(fā)布于1988年,但其物理編碼內(nèi)容并不落伍。本人于1999年涉足游戲物理引擎程序設(shè)計,并在一款賽車游戲中負責車輛模型的物理引擎開發(fā),期待中一個月的開發(fā)周期最終變得遙遙無期。
開始階段,物理問題并未引起足夠重視,因而產(chǎn)生了各種各樣的問題。例如,硬質(zhì)懸掛彈簧將車輛以螺旋方式彈射至無限遠處;摩擦力導致輪胎高速旋轉(zhuǎn)時產(chǎn)生振動現(xiàn)象;硬質(zhì)表面呈現(xiàn)為軟質(zhì)橡膠材質(zhì)。對此,我曾嘗試了多種處理方案,包括沖量方案、Jacobian方案、規(guī)約坐標方案以及模擬物理方案,其學習曲線不同于之前任何游戲編碼經(jīng)歷。
盡管開發(fā)時間超出了最后的期限(開發(fā)內(nèi)容為向第三人稱射擊行為提供物理驅(qū)動),但公司人員依然對各個中間件物理系統(tǒng)進行了嚴格檢測,本人也從中了解到各類方案的優(yōu)缺點。在隨后的開發(fā)歲月中,本人所編寫的代碼體現(xiàn)了一定的復用性,并應用于多個不同場合。隨著經(jīng)驗的不斷積累,本人也研發(fā)了多款物理引擎,并為諸多應用制定了相關(guān)的物理解決方案。關(guān)于如何獲取最為簡單的方案以及最佳物理效果,我自認為具有正確的判斷力。
游戲開發(fā)已步入了物理模擬商品化這一階段,即物理模擬常出現(xiàn)于各類游戲中,且開發(fā)公司均會研制內(nèi)部物理庫,或?qū)δ骋恢饕闹虚g件處理方案提供應用許可。盡管物理行為日趨普遍,但其研發(fā)階段仍可視為一個黑盒過程,即開發(fā)人員負責實現(xiàn)物理行為,其他團隊則直接使用結(jié)果。
關(guān)于游戲物理學,相關(guān)信息以及參考資料均假設(shè)讀者具有一定的數(shù)學和物理知識。然而,某些著作僅羅列了相應的物理內(nèi)容,且不包含對應的應用框架結(jié)構(gòu)。更為糟糕的是,一些資料甚至包含了某些錯誤理論,進而使讀者陷入困境。物理引擎通常較為復雜,且存在較大的優(yōu)化和改良空間,部分內(nèi)容還有待于進一步探討研究。例如,在讀者嘗試實現(xiàn)Lemke樞軸算法之前,應于先期理解其基本概念并包含相應的代碼測試框架。
本書源自個人初始階段所經(jīng)歷的種種磨難,同時也希望本書能夠填補這一方面的空白,且兼顧邏輯性和清晰易懂之特征,進而引領(lǐng)讀者從零開始打造一款屬于自己的物理引擎。本書僅是萬里長征中的第一步,但卻是堅實的一步,因為我們已然擁有了正確的方向。
本書附帶光盤
本書附帶光盤包含了源代碼庫,進而實現(xiàn)本書所討論的各項技術(shù)以及示例程序。該代碼庫易于閱讀,并輔以注釋和應用示例。
本書附帶光盤中的全部內(nèi)容已上傳至www.tup.com.cn,請讀者自行下載。
關(guān)于作者
Ian Millington,IPR Ventures咨詢公司合伙人,該公司致力于次世代技術(shù)的研發(fā)工作,涉及娛樂、建模技術(shù)以及模擬仿真技術(shù)。在此之前,他曾創(chuàng)辦了Mindlathe Ltd(計算機游戲領(lǐng)域內(nèi)一家最大的專業(yè)AI中間件公司),并涉足多種游戲類型以及開發(fā)技術(shù)。Ian Millington具有深厚的AI專業(yè)背景,包括復雜理論和自然計算博士項目研究。除此之外,他還發(fā)表了多篇專業(yè)學術(shù)論文和文章,內(nèi)容涉及古生物學和超文本技術(shù)。同時,他還是Artificial Intelligence for Games一書的作者(該書由Morgan Kaufmann出版社于2006年出版)。
致謝
本書旨在打造一款健壯的游戲物理引擎,該過程歷盡艱辛并得到了編碼人員以及數(shù)學家們的巨大幫助,本書的出版源自他們所發(fā)表的論文和文章、SIGGRAPH大會演講以及所發(fā)布的源代碼。當然,我的感謝名單遠不止于此,這里要著重感謝Chris Hecker,Andrew Watkin和David Barraf,其思想奠定了本書的編寫風格。
感謝本書技術(shù)評審小組成員所付出的艱辛勞動,他們是Philip J. Schneider,Jonathan Purdy博士以及Eitan Grinspun,他們的建議極大地提升了本書的編寫質(zhì)量、可讀性以及有效性。另外,這里還要特別感謝Dave Eberly,他對細節(jié)的關(guān)注令我受益匪淺。
本書編寫時恰逢RandD咨詢公司創(chuàng)業(yè)期,因而本書獻給我的妻子Mel,感謝她兩年來陪我度過無數(shù)個不眠之夜。
《游戲物理引擎開發(fā)》
第1章 概述
1.1 游戲物理
1.2 物理引擎
1.2.1 物理引擎的優(yōu)點
1.2.2 物理引擎的缺點
1.3 物理引擎的實現(xiàn)方案
1.3.1 對象類型
1.3.2 碰撞處理方案
1.3.3 沖量和作用力
1.3.4 構(gòu)建內(nèi)容
1.4 物理引擎中的數(shù)學
1.4.1 必備的數(shù)學知識
1.4.2 數(shù)學知識回顧
1.4.3 本書引入的數(shù)學概念
《游戲物理引擎開發(fā)》
第1章 概述
1.1 游戲物理
1.2 物理引擎
1.2.1 物理引擎的優(yōu)點
1.2.2 物理引擎的缺點
1.3 物理引擎的實現(xiàn)方案
1.3.1 對象類型
1.3.2 碰撞處理方案
1.3.3 沖量和作用力
1.3.4 構(gòu)建內(nèi)容
1.4 物理引擎中的數(shù)學
1.4.1 必備的數(shù)學知識
1.4.2 數(shù)學知識回顧
1.4.3 本書引入的數(shù)學概念
1.5 本書源代碼
1.6 本書組織方式
第1部分 粒 子 物 理
第2章 粒子數(shù)學
2.1 向量
.2.1.1 左手空間和右手空間
2.1.2 向量和方向
2.1.3 標量和向量的乘法運算
2.1.4 向量的加法和減法運算
2.1.5 向量乘法
2.1.6 分量積
2.1.7 標量積
2.1.8 向量積
2.1.9 正交基向量
2.2 積分運算
2.2.1 微分學
2.2.2 積分運算
2.3 本章小結(jié)
第3章 運動定律
3.1 粒子
3.2 運動定律
3.2.1 牛頓第一定律
3.2.2 牛頓第二定律
3.2.3 力學方程
3.2.4 向粒子添加質(zhì)量
3.2.5 動量和速度
3.2.6 重力
3.3 積分算式
3.3.1 更新方程
3.3.2 完整的積分算式
3.4 本章小結(jié)
第4章 粒子物理引擎
4.1 彈道軌跡
4.1.1 設(shè)置發(fā)射對象屬性
4.1.2 實現(xiàn)方法
4.2 焰火效果
4.2.1 焰火數(shù)據(jù)
4.2.2 焰火效果規(guī)則集
4.2.3 實現(xiàn)方法
4.3 本章小結(jié)
第2部分 質(zhì)量集合體物理
第5章 合力
5.1 d'alembert定理
5.2 作用力發(fā)生器
5.2.1 接口和多態(tài)
5.2.2 實現(xiàn)方法
5.2.3 重力發(fā)生器
5.2.4 阻力發(fā)生器
5.3 內(nèi)建重力和阻尼機制
5.4 本章小結(jié)
第6章 彈力
6.1 胡克定律
6.1.1 彈力限制條件
6.1.2 彈性材質(zhì)
6.2 彈力發(fā)生器
6.2.1 基礎(chǔ)型彈力發(fā)生器
6.2.2 固定彈簧發(fā)生器
6.2.3 彈性橡皮筋
6.2.4 浮力發(fā)生器
6.3 硬質(zhì)彈簧
6.3.1 硬質(zhì)彈簧產(chǎn)生的問題
6.3.2 仿硬質(zhì)彈簧
6.4 本章小結(jié)
第7章 硬約束條件
7.1 簡單的碰撞解決方案
7.1.1 閉合速度
7.1.2 回彈系數(shù)
7.1.3 碰撞法向和碰撞法線
7.1.4 沖量
7.2 碰撞處理方案
7.2.1 碰撞檢測
7.2.2 處理相交對象
7.2.3 靜態(tài)碰撞
7.3 碰撞處理算法
7.3.1 處理順序
7.3.2 時分引擎
7.4 類碰撞材質(zhì)
7.4.1 繩索
7.4.2 連桿
7.5 本章小結(jié)
第8章 質(zhì)體物理引擎
8.1 引擎概述
8.2 使用物理引擎
8.2.1 索橋和線纜
8.2.2 摩擦力
8.2.3 blob游戲
8.3 本章小結(jié)
第3部分 剛體物理系統(tǒng)
第9章 旋轉(zhuǎn)操作的數(shù)學知識
9.1 二維環(huán)境下的旋轉(zhuǎn)對象
9.1.2 角速度
9.1.3 原點和質(zhì)心
9.2 三維環(huán)境中的方向
9.2.1 歐拉角
9.2.2 軸-角
9.2.3 旋轉(zhuǎn)矩陣
9.2.4 四元數(shù)
9.3 角速度和加速度
9.3.1 點速度
9.3.2 角加速度
9.4 實現(xiàn)方案
9.4.1 矩陣類
9.4.2 矩陣乘法
9.4.3 逆矩陣和轉(zhuǎn)置矩陣
9.4.4 將四元數(shù)轉(zhuǎn)換為矩陣
9.4.5 轉(zhuǎn)換向量
9.4.6 調(diào)整矩陣中的基向量
9.4.7 四元數(shù)類
9.4.8 四元數(shù)的標準化操作
9.4.9 四元數(shù)組合操作
9.4.10 旋轉(zhuǎn)
9.4.11 基于角速度的更新操作
9.5 本章小結(jié)
第10章 剛體運算定律
10.1 剛體
10.2 基于旋轉(zhuǎn)的牛頓第二定律
10.3 轉(zhuǎn)矩
10.3.1 轉(zhuǎn)動慣量
10.3.2 世界坐標系中的慣性張量
10.4 基于旋轉(zhuǎn)的d'alembert定理
10.5 剛體積分運算
10.6 本章小結(jié)
第11章 剛體物理引擎
11.1 引擎概述
11.2 物理引擎應用
11.2.1 飛行模擬器
11.2.2 帆船模擬器
11.3 本章小結(jié)
第4部分 碰撞檢測系統(tǒng)
第12章 碰撞檢測
12.1 碰撞檢測管線
12.2 粗略碰撞檢測
12.3 包圍體
12.3.1 層次結(jié)構(gòu)
12.3.2 構(gòu)造層次結(jié)構(gòu)
12.3.3 子對象層次結(jié)構(gòu)
12.4 空間數(shù)據(jù)結(jié)構(gòu)
12.4.1 二分空間劃分
12.4.2 八叉樹和四叉樹
12.4.3 網(wǎng)格方案
12.4.4 多分辨率圖
12.5 本章小結(jié)
第13章 生成碰撞
13.1 碰撞幾何體
13.1.1 圖元組裝
13.1.2 生成碰撞幾何體
13.2 碰撞生成過程
13.2.1 碰撞數(shù)據(jù)
13.2.2 點-面碰撞
13.2.3 邊-邊碰撞
13.2.4 邊-面碰撞
13.2.5 面-面碰撞
13.2.6 前期退出
13.3 圖元碰撞算法
13.3.1 球體間的碰撞
13.3.2 球體和平面之間的碰撞
13.3.3 盒體與平面之間的碰撞
13.3.4 球體與盒體之間的碰撞
13.3.5 盒體間的碰撞
13.3.6 效率和通用多面體
13.4 本章小結(jié)
第5部分 接觸型物理系統(tǒng)
第14章 碰撞處理方案
14.1 沖量和沖擊轉(zhuǎn)矩
14.1.1 沖擊轉(zhuǎn)矩
14.1.2 旋轉(zhuǎn)碰撞
14.1.3 處理旋轉(zhuǎn)碰撞
14.2 碰撞沖量
14.2.1 調(diào)整碰撞坐標系
14.2.2 基于沖量的速度變化
14.2.3 基于速度的沖量變化
14.2.4 計算期望速度變化
14.2.5 沖量計算
14.2.6 沖量應用
14.3 處理相交行為
14.3.1 方案選取
14.3.2 實現(xiàn)非線性投影
14.3.3 避免過度的旋轉(zhuǎn)
14.4 碰撞處理過程
14.4.1 碰撞處理管線
14.4.2 預置碰撞數(shù)據(jù)
14.4.3 處理相交問題
14.4.4 處理速度
14.4.5 更新算法的替代方案
14.5 本章小結(jié)
第15章 靜態(tài)接觸和摩擦力
15.1 靜態(tài)作用力
15.2 微碰撞
15.2.1 移除速度
15.2.2 減少復原
15.2.3 計算最新速度
15.3 摩擦力類型
15.3.1 靜態(tài)摩擦力和動態(tài)摩擦力
15.3.2 各向同性摩擦力和各向異性摩擦力
15.4 摩擦力實現(xiàn)方案
15.4.1 基于沖量的摩擦力
15.4.2 調(diào)整速度處理算法
15.4.3 整合方案
15.5 碰撞和連續(xù)碰撞處理
15.6 本章小結(jié)
第16章 穩(wěn)定性和優(yōu)化問題
16.1 穩(wěn)定性
16.1.1 四元數(shù)漂移
16.1.2 斜面上的相交
16.1.3 積分穩(wěn)定性
16.1.4 保守碰撞檢測的優(yōu)點
16.1.5 調(diào)整數(shù)學精確度
16.2 優(yōu)化操作
16.2.1 休眠機制
16.2.2 相交和速度誤差處理
16.2.3 碰撞(接觸)分組機制
16.2.4 代碼優(yōu)化
16.3 本章小結(jié)
第17章 整合方案
17.1 引擎綜述
17.2 物理引擎應用
17.2.1 布娃娃系統(tǒng)
17.2.2 斷裂物理學
17.2.3 爆炸物理學
17.3 引擎的局限性
17.3.1 堆砌型對象
17.3.2 反作用力摩擦力
17.3.3 關(guān)節(jié)組裝
17.3.4 硬質(zhì)彈簧
17.4 本章小結(jié)
第6部分 擴 展 引 擎
第18章 其他物理引擎
18.1 同步碰撞處理
18.1.1 jacobian方案
18.1.2 線性互補問題
18.2 約化坐標方案
18.3 本章小結(jié)
參考文獻
附錄a 常見慣性能量
a.1 離散質(zhì)體
a.2 連續(xù)質(zhì)體
a.3 常見形狀
a.3.1 長方體
a.3.2 球體
a.3.3 圓柱體
a.3.4 圓錐體
附錄b 游戲中常見的摩擦系數(shù)
附錄c 其他程序設(shè)計語言
c.1 c語言
c.2 java語言
c.3 公共語言運行庫(.net)
c.4 lua語言
附錄d 數(shù)學背景知識
d.1 向量
d.2 四元數(shù)
d.3 矩陣
d.4 積分運算
d.5 物理運算
d.6 其他公式