[情報] 遊戲物理&動態程序動畫 學習資源整理

作者: cjcat2266 (CJ Cat)   2019-07-12 01:50:23
因為之前在一個Unity討論區被問到
從何學起遊戲物理模擬(game physics simulation)
和動態程序動畫(procedural animation)
發現要回的東西在太多了,不如寫成一篇文,也便於分享給更多人,就po在這邊囉 :)
首先,基礎要會的是3D數學,包含向量、幾何、線性代數
網路上能找到些不錯的單一主題教學
在此我推薦兩本把各種主題有系統性地集合起來的書
3D Math Primer For Graphics and Game Development
https://www.amazon.com/dp/1556229119/
Essential Mathematics for Games and Interactive Applications
https://www.amazon.com/dp/0123742978/
我自己也有寫一些主題&撇步式的遊戲數學文章
http://allenchou.net/game-math-series/
再來,處理物理模擬的第一步是碰撞偵測(collision detection)
所謂碰撞偵測不是字面上的 "處理物件在物理上的碰撞"
而是回答這個是非題: "兩個物件在空間上是否有重疊"
若有空間重疊重疊,在物理模擬上稱做碰撞(collision)
有時候在遊戲中只要能夠回答這個是非題就夠了
以下這本人稱橘色書("The Orange Book")算是碰撞偵測的聖經吧
涵蓋了各種基礎(primitive)3D形狀組合的一對一碰撞偵測法,還有各種優化技巧
Real-Time Collision Detection
https://www.amazon.com/dp/1558607323/
除了各種基礎形狀之間的碰撞偵測外
還有個GJK(Gilbert-Johnson-Keerthi)演算法
是個很常用的泛用型凸(convex)形狀碰撞偵測演算法
以下這本書主要是在介紹GJK
Collision Detection in Interactive 3D Environments
https://www.amazon.com/dp/155860801X
不過上面這本書讀起來有點硬
GJK其實沒有那麼艱澀難懂,我自己也有寫一個物理引擎系列教學文
有篇是在介紹GJK,算是那本書的重點整理吧
http://allenchou.net/game-physics-series/
知道兩個物件有碰撞之後
要讓他們分開的步驟稱為碰撞解析(collision resolution)
第一步是需要找到碰撞接觸點(collision contact)和接觸撞法線(contact normal)
一般是找能夠將兩個物體透過最短移動距離分開的接觸撞點與法線
GJK只會給你物體"是否有碰撞"的一個布林值答案
需要利用額外的計算才能找到碰撞點和碰撞法線
其中一個演算法叫做EPA (Expanding Polytope Algorithm)
我也有寫過個EPA簡介
http://allenchou.net/2013/12/game-physics-contact-generation-epa/
兩相互碰撞的物體間最適合用來解析的資料結構,不一定是單一接觸點與法線
而是多組接觸點與法線,如疊在一個箱子上的另外一個箱子
這種多組接觸點與碰線的集合稱為接觸流形(contact manifold)
跨禎(cross-frame)存在的接觸流形稱為恆存接觸流形(persistent contact manifold)
有助於模擬暖身(simulation warmstarting)以增進穩定性
我寫過個如何跨禎將單一接觸點與法線
融合進恆存接觸流形的重點整理
http://allenchou.net/2014/01/game-physics-stability-warm-starting/
我的遊戲物理系列文算是我個人的學習筆記
裡面涵蓋了從零做起遊戲物理引擎模擬所需的技術
包含基礎動力學、廣階(broadphase)優化、碰撞偵測、碰撞解析、穩定性
這是目錄 http://allenchou.net/game-physics-series/
遊戲物理模擬方式有很多種,我採用的是目前各大物理引擎常用的方式
如Box2D、Bullet、Havok等
名為制限式鋼體物理模擬(constraint-based rigid body physics simulation)
說到Box2D,其作者Erin Catto(現為Bilzzard首席物理工程師)
在GDC做了很多次非常棒的演講,我非常推薦看看這些演講
學會術語之後,就能看懂Box2D裡面各種變數名稱與註解
用這些資源搭配解讀Box2D的程式碼來學習非常有效
https://box2d.org/downloads/
接下來是動態程序動畫
凡是利用程式動態產生的動畫或物件互動都屬於此類
像是單純的球池模擬、鎖鏈甩動、目標追隨
我推薦以下兩本涵蓋了很多範例和模組化概念的書
雖然程式語言是ActionScript 3.0,但概念是共通的
Foundation Actionscript 3.0 Animation: Making Things Move!
https://www.amazon.com/dp/1590597915/
AdvancED ActionScript 3.0 Animation
https://www.amazon.com/dp/1430216085/
動態程序動畫能夠讓遊戲有動態互動感
很多人愛稱這種感覺為 "多汁(juicy)"
最常用的加汁技巧為漸變(tweening)
把數值隨著時間從初始值漸漸移動到到目標值都可稱作漸變
用來漸變的數學曲線稱作漸變曲線(easing curves)
用這幾個關鍵字在網路上可以找到很多學習資源
另外一個加汁技巧,我稱為數值彈簧(numeric springing)
不像漸變,數值彈簧是持續的物理模擬,能有效且圓滑地處理動態目標值
我有針對數值彈簧寫一個系列教學文
基礎
http://allenchou.net/2015/04/game-math-precise-control-over-numeric-springing/
範例 http://allenchou.net/2015/04/game-math-numeric-springing-examples/
補充 http://allenchou.net/2015/04/game-math-more-on-numeric-springing/
數值彈簧概念
是基於Erin Catto的一篇泛用軟性制限(soft constraint)的教學衍伸出來的
http://box2d.org/files/GDC2011/GDC2011_Catto_Erin_Soft_Constraints.pdf
本教學與制限式物理引擎中的Baumgarte穩定性(stabilization)關係密切
算是用更精準的參數
作者: wewe10112 (xenoalien)   2019-07-25 11:41:00
推一個
作者: Bencrie   2019-07-12 02:09:00
推書單
作者: jfmf (jfmf)   2019-07-12 07:51:00
推分享
作者: BeStronger ( )   2019-07-12 08:49:00
感謝分享!
作者: iverson7761 (雙子座*AB男)   2019-07-12 11:11:00
作者: NCTU87 (八七)   2019-07-12 11:36:00
作者: Pony5566 (Luna Akbar)   2019-07-12 11:59:00
先推
作者: zxshih (zxshih)   2019-07-12 13:58:00
推推><
作者: art1 (人,原來不是人)   2019-07-12 17:07:00
推!
作者: eugenelinrmx   2019-07-12 17:27:00
推分享
作者: wangm4a1 (水兵)   2019-07-12 19:06:00
作者: rhox (天生反骨)   2019-07-12 19:29:00
作者: allen2207153 (小王)   2019-07-12 20:18:00
作者: coolrobin (泳圈)   2019-07-12 21:37:00
不推不行
作者: Lhmstu (lhmstu)   2019-07-13 11:40:00
作者: willier15987 (Tuantuan)   2019-07-13 13:25:00
作者: kirai (囧RZ)   2019-07-13 14:55:00
Push!
作者: leonardo0917   2019-07-13 16:17:00
未看先推
作者: riveranb (River)   2019-07-13 23:13:00
超聖推
作者: shuain (shuain1016)   2019-07-14 00:47:00
讚讚
作者: nyms (nyms)   2019-07-14 15:04:00
朝聖推
作者: TWayne (TWin)   2019-07-15 09:33:00
朝聖
作者: johnny94 (32767)   2019-07-16 10:13:00
推推
作者: NX9999 (台中走鐘張勛傑)   2019-07-16 22:00:00
推推
作者: pumapupa   2019-07-17 13:34:00
朝聖推
作者: ShadowInWind (炸雞)   2019-07-21 09:16:00
朝聖
作者: a82611141   2019-07-22 18:14:00
作者: ConSeR (草履重根)   2019-09-08 19:32:00
推 優文

Links booklink

Contact Us: admin [ a t ] ucptt.com