作者cjcat2266 (CJ Cat)
看板Programming
标题Fw: [情报] 游戏物理&动态程序动画 学习资源整理
时间Fri Jul 12 04:36:28 2019
※ [本文转录自 GameDesign 看板 #1T9tRlWn ]
作者: 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 04:36:28
※ 编辑: cjcat2266 (160.33.168.6 美国), 07/12/2019 09:11:10
1F:推 jacky60302: 推推 感谢整理 223.137.66.42 10/31 17:04