本書是常用線性代數和碰撞檢測遊戲的綜合指南,但僅簡要介紹了碰撞解決(物理)主題。本書架構如下:
本書涵蓋的所有主題都用於逐步建立剛體物理引擎。最後三章(14、15 和 16)實現了粒子物理、剛體物理和軟體物理(布料)。提供的附錄簡要介紹了高級主題、探索這些主題的資源以及其他探索遊戲物理的資源。
為這本書創建的一些圖表並沒有很好地印刷出來。為了解決這個問題,我已將所有書中的圖表包含在此存儲庫中,並在線發布這些圖表:https://github.com/gamephysicalscookbook/Figures
本書的前三章致力於教導遊戲開發所需的基本線性代數。每個概念都在數學背景下進行解釋,為每個概念提供原始程式碼,並且當可以直觀地探索某些內容時還提供圖像。在前三章中創建了以下資料結構:
vec2
)vec3
)mat2
)mat3
)mat4
)如果可能,矩陣運算以通用方式實現。例如,提供了將兩個任意大小的矩陣相乘的代碼。
本書涵蓋了以下交叉點:
觀點 | 線 | 射線 | 領域 | AABB | 奧布 | 飛機 | 三角形 | 截錐體 | |
---|---|---|---|---|---|---|---|---|---|
觀點 | |||||||||
線 | |||||||||
射線 | |||||||||
領域 | |||||||||
AABB | |||||||||
奧布 | |||||||||
飛機 | |||||||||
三角形 | |||||||||
截錐體 |
第 14 章介紹了樸素粒子物理學,本章旨在介紹如何建立物理循環並考慮物理循環的一般格式。第15章是最有趣的一章,它實現了一個基本的剛體物理引擎。基本引擎支援定向盒子和球體,可以使堆疊工作,但不直接支援。第 16 章介紹了彈簧以及如何使用彈簧來實現軟體物理。本書的最後一個示範是軟體、布料物理示範。
這是我的第一本書,我學到了很多關於寫作過程的知識;也許更多的是關於規劃。以下是我在寫這本書時發現的一些我沒有正確計劃的事情的清單:
四元數:擁有四元數是必須的!我計劃使用歐拉旋轉和旋轉矩陣來寫這本書。雖然這有效,但獲得四元數會讓事情變得容易得多。
Planes :平面相交不應傳回布林值,它們應將相交分類為:後面、相交、前方。最好,如果交叉路口在前面或後面,您希望返回一些距離指示。這在進行視錐體剔除時變得非常有用。我不知道我要寫多深入的平截頭體,所以我決定做簡單的布林交集。
光線投射:我應該編寫光線投射以從一開始就返迴光線投射結果。後來不得不返回並重新編寫光線投射 API,結果發現用文字表達比我預期的更複雜。這背後的困難是一開始就讓事情變得簡單,只在需要時才變得複雜。
原始碼的物理實作存在各種問題。這些問題來自於本書的物理部分必須壓縮為三章。只是沒有足夠的時間來涵蓋製作強大的剛體物理系統所需的所有內容。這引擎最大的問題是沒有Arbiter 。
如果沒有仲裁器,我們就無法建構順序脈衝求解器。這給我們留下了一個相當簡單的脈衝求解器。問題是,每個幀的每個接觸都解決了脈衝。這會導致過度滑動。我透過線性投影和積極的摩擦偏移來補償順序脈衝的缺乏。較舊的實體引擎也做了類似的事情,就是依靠強硬的睡眠來掩蓋問題。不用說,睡眠並沒有實現。
如果我有機會寫本書的第二版,我將刪除有關二維碰撞的章節(第4、5和6章)並減少場景管理章節的頁數。我計劃使用額外的頁面來涵蓋以下主題: