![7c492d6e298c80149941d381fcc8ee4b.png](https://i-blog.csdnimg.cn/blog_migrate/28b3fe64965393989beec0beeeb77725.jpeg)
物理引擎是当今游戏、电影特效、虚拟现实(VR/AR)、工业生产、以及很多科研中必不可少的工具,因为我们需要真实地模拟这个世界,从而创造出精致的作品,作出巧妙的决策。
我们大多数人认识物理,是通过中学时的一维单质点模型。它让我们了解 “力是改变物体速度的原因”,并学会求解做匀加速直线运动的物体在任意时刻的速度和位置。
![a293a95ce65b598ce30fbd9ccc706fe9.png](https://i-blog.csdnimg.cn/blog_migrate/179eb16faa6c094ebdc56d1bd47b450e.jpeg)
然而,这个世界的复杂程度超乎我们的想象:物体和它的运动不只有一个维度,其受力不仅在时间轴上是不均匀的,在空间上通常也是如此!因此到了大学,在学习普通物理之前,我们的高数老师首担重任,率先把表达多维世界的语言——线性代数,处理不均匀非线性函数的方法——微积分/数学分析,以及可以说是二者结合的 “多元微积分”、“张量(tensor)“等概念教给我们,来作为解构这个复杂世界的工具。
![b5b91600b792023ce4263247c0038e73.png](https://i-blog.csdnimg.cn/blog_migrate/2d06b86f5bb877e99c66cc4eeecceb09.jpeg)
这些数学工具帮助我们将定义在连续空间的动力学和运动学方程(偏微分方程)严谨地写成近似形式(比如weak form),从而进一步可以离散成计算机能够描述并计算的形式,比如finite element method(FEM)有限元方法、material point method(MPM)物质点法等。他们在实现成计算机程序后,的确也需要很大的计算量,正如我们所听说的,“一帧电影特效场景要模拟和渲染几个小时”,“工业制造中比如机翼的风洞模拟要几天甚至几周”。为什么我们需要这么复杂的物理引擎?物理模拟真的必须这么复杂吗?
![3a301c960f35fe87c4540db1a98ac634.png](https://i-blog.csdnimg.cn/blog_migrate/0d4c656e4707e8ac51a83e7558bf3c01.jpeg)
对于这个问题,首先尝试说“不”的,是一群对于几何有着敏锐嗅觉的研究人员(以加州理工的数字几何处理研究组为代表)。他们提出,模拟不一定非要从连续形式慢慢推导成离散形式,而是可以直接从离散出发,运用微分几何知识来构建出物理模型。比如著名的discrete shell,把布料被弯曲(从而产生褶皱)的难易程度,直接建模成惩罚相邻三角形面片间的夹角不为180度的能量函数,并用一个惩罚系数来调整,直观又好用。
![892979c83a7be3847e941788427f8168.png](https://i-blog.csdnimg.cn/blog_migrate/1cf71c66a214cdb30b615b388f710bef.jpeg)
但是问题也随之而来了,那就是当使用不同数量的三角面片来表示同一个布料的时候,如果discrete shell的惩罚系数不变,这两个不同分辨率的布料三角形网格并不能模拟出同一种布料!也就是说FEM里的convergence under refinement在discrete shell里是不满足的,因为直接从离散形式开始建模,缺少了对分辨率和模型之间关系的考量。
![23ac820ded5719c1409d30cdf556059b.png](https://i-blog.csdnimg.cn/blog_migrate/ffa043fbee7d2d7d201ba88f2e83f2c5.jpeg)
而对于从连续形式出发的FEM等物理模拟方法,不同分辨率只是对于同种材料连续体的不同离散,尽管在分辨率比较低时模型会由于数值原因表现得稍硬,在不断提高分辨率的过程中,模拟结果是会在理论保证下不断接近于真实观测解的。在这个过程中,模型的参数只需要保持和真实世界一致就好了,不存在“调”的概念,而是“选择”使用什么样的材料。
类似的,最近游戏和VR届很火的position based dynamics(PBD)也是直接从离散形式出发,用一组点以及他们之间直观的相互作用来表示连续的物体。不仅好理解、易实现,而且计算量不大,甚至可以实时高分辨率模拟。然而,要使用PBD来模拟出真实的场景并不容易。
![5653f6335273785add18904769430cca.png](https://i-blog.csdnimg.cn/blog_migrate/232441ec65e09fd63f6fdad7dc06029c.png)
拿固体举例,我们知道表示弹性体硬度的参数有杨氏模量和泊松比,然而在PBD里,很多参数并不能在现实世界中找到对应。那么要想模拟一个真实场景,就需要花大量时间调参数。更头疼的是什么呢?之前我们提到了直接从离散形式出发的discrete shell在不同分辨率下需要不同参数来表达同一种布料,PBD也类似。当你好不容易调好参数了,老板说 “赞!现在加高分辨率让效果更细致吧!” GG,加高分辨率,重新调参数。
在PBD中,很多物理模型由简单的constraint建模而成,比如弹性体被描述成相邻点之间的距离保持原始值不变。那么当constraint完美满足时模拟的物体就是刚体,constraint越不满足,物体越软,乍一听好聪明!可是如何控制constraint的满足程度呢?原始的PBD是通过求解constraint的迭代次数来调整的,解得次数越多,constraint往往越满足,物体就越硬。然而就像之前提到的,不说分辨率了,哪怕同分辨率换一个形状,可能迭代次数都要重新调整。调不好迭代次数导致求解出数值不稳定的结果,可能还有数值爆炸的危险!虽然数值爆炸不伤人,但伤心啊!
![4b580b8cf31286d9d41218000755b790.png](https://i-blog.csdnimg.cn/blog_migrate/4cc3c32c5e59a2ab7e5f4ad2077dd74a.png)
所以后来PBD的研究人员开发了X-PBD,用更加有理论保障的类似拉格朗日乘子法的思想来更稳妥的建模constraint的“满足程度”,从而也提高了程序的稳定性。但它的劣势依然存在。从SIGGRAPH论文来看,他们目前也在做更有理论基础的FEM的研究,今年夏天的英伟达发布会我们拭目以待。
有的朋友可能会质疑,弹性体为什么不能直观的建模成一组点之间的相互作用呢?组成物体的分子不正是这样?是啊,目前对于微观世界的认知告诉我们物体由分子这样的“点”组成,但试问当今谁能通过模拟几亿甚至几万亿个分子来模拟宏观的弹性体吗?FEM和MPM这类方法的精妙之处就在于,它们看似也只是用一组点来表示一个物体,实则依然通过插值函数保有连续体的概念:所有的物理量,包括位移、形变、应力、速度等,在这个物体中的每一个位置都有定义,他们的值由附近采样点的值插值而来。这样就保证了模拟的物体依然是连续的,它们并不是只有一些点,他们的力和弹性波会在物体的连续空间中自由传递,他们的动能和动量在连续空间中积分也就保证了任意分辨率的不相关性!
我想用过PBD的R&D朋友们一定有一个共同的愿望,什么时候能不要这么难调参数呢?其实这个愿望不难实现,用从连续形式出发的模型,比如FEM或MPM就可以了。当然,目前这些模型还不能在实时模拟的限制下跑特别高分辨率的场景。但这真的是问题吗?我记得小时候,下载几百兆的红色警戒需要一个小时,现在呢?将来呢?
随着硬件技术的发展,我们的计算机拥有了越来越大的计算能力,我们是否应该抛开一些顾虑,做最好效果,最稳定的物理模拟方法和物理引擎,做适用于不同架构硬件比如GPU、多GPU、云计算等的算法,来推动整个产业的发展,对这个世界做更深入的解构呢?