Fw: [情报] 游戏物理&动态程序动画 学习资源整理

楼主: cjcat2266 (CJ Cat)   2019-07-12 04:36:28
※ [本文转录自 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)关系密切
算是用更精准的参数

Links booklink

Contact Us: admin [ a t ] ucptt.com