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