作者cjcat2266 (CJ Cat)
看板GameDesign
标题[情报] 游戏物理&动态程序动画 学习资源整理
时间Fri Jul 12 01:50:23 2019
因为之前在一个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)关系密切
算是用更精准的参数--
震荡频率(oscillation frequency)与震幅衰退率(oscillation amplitude decay rate)
--来计算Baumgarte稳定性常数的方式
以上大概就是我所知道的相关资源了
本文提到的一些术语,若看不懂,顺着上述资源学习研究就能循序理解
学会之後就可以自由应用了
Good luck & have fun!
--
Web
http://AllenChou.net
Twitter
http://twitter.com/TheAllenChou
LinkedIn
http://linkedin.com/in/MingLunChou
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 160.33.168.6 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1562867439.A.831.html
※ 编辑: cjcat2266 (160.33.168.6 美国), 07/12/2019 02:01:34
1F:推 Bencrie: 推书单 07/12 02:09
※ 编辑: cjcat2266 (160.33.168.6 美国), 07/12/2019 04:45:21
2F:推 jfmf: 推分享 07/12 07:51
3F:推 BeStronger: 感谢分享! 07/12 08:49
※ 编辑: cjcat2266 (160.33.168.6 美国), 07/12/2019 09:10:48
4F:推 iverson7761: 推 07/12 11:11
5F:推 NCTU87: 推 07/12 11:36
6F:推 Pony5566: 先推 07/12 11:59
7F:推 zxshih: 推推>< 07/12 13:58
8F:推 art1: 推! 07/12 17:07
9F:推 eugenelinrmx: 推分享 07/12 17:27
10F:推 wangm4a1: 推 07/12 19:06
11F:推 rhox: 推 07/12 19:29
12F:推 allen2207153: 推 07/12 20:18
13F:推 coolrobin: 不推不行 07/12 21:37
14F:推 Lhmstu: 推 07/13 11:40
15F:推 willier15987: 推 07/13 13:25
16F:推 kirai: Push! 07/13 14:55
17F:推 leonardo0917: 未看先推 07/13 16:17
18F:推 riveranb: 超圣推 07/13 23:13
19F:推 shuain: 赞赞 07/14 00:47
20F:推 nyms: 朝圣推 07/14 15:04
21F:推 TWayne: 朝圣 07/15 09:33
22F:推 johnny94: 推推 07/16 10:13
23F:推 NX9999: 推推 07/16 22:00
24F:推 pumapupa: 朝圣推 07/17 13:34
25F:推 ShadowInWind: 朝圣 07/21 09:16
26F:推 a82611141: 推 07/22 18:14
27F:推 wewe10112: 推一个 07/25 11:41
28F:推 ConSeR: 推 优文 09/08 19:32