一、前言
这是本专栏的倒数第二篇文章了,为什么不是最后一篇?因为我要单独写一篇总结哈哈,不管怎么说,从今年的3.13的MVP变换开始写,写到现在,也是一个很大的工程了,我很高兴能在大二下学期的期中这个时间点完成我人生中写的第一篇专栏,它没有什么开创性,但是对我来说意义重大,多余的话这里就不说了,这篇为大家介绍GAMES101最后一节课所讲的内容,利用欧拉方法求解常微分方程和刚体与流体的模拟,上篇我们趋向于动画与模拟这块的介绍,这篇我们主要讲细节。
二、单个粒子的模拟
我们规定了一个粒子任何一个时刻的速度,我们又知道这个粒子一开始的位置,那么我们如何求解某个时间之后它出现在哪里呢?这个很简单,高中的物理公式。
那么我们定义一个速度场,类似于电场和磁场,给定任意一个位置,我都知道这个位置对应的速度,这就比较困难了。
1.常微分方程
根据上面所说的,我们定义出来任意一点的速度公式如上图,而这就是一个常微分方程。常微分方程中,已知量是微分值,而未知量是原始值。我们要做的就是求解原始的微分之前的值。而常微分方程(ODE)顾名思义就是只涉及一个微分的方程,与之对应的是偏微分方程(PDE)。带入到我们这里就是,我们知道速度,想求位置。
2.欧拉方法
我们说了我们想求一个粒子的位置,想求任意时刻的位置,我们需要一个起始位置,这里假如是Xt,如上图中的t写在右上角表示t时刻。我们取一个Δt,也就是步长,根据上面的公式,我们每个下一个步长的位置和速度都可以根据上一个步长的速度和加速度求得。这种所有下一步的量都由上一步估计的方法就叫做前向欧拉方法,或者叫显式欧拉方法。
欧拉方法有一定的问题,如上图所示,我们的步长取多长影响了最终我们得出的运动轨迹和我们想要的运动轨迹的拟合程度的精确,显然步长取的越小越密效果越好。
其次,欧拉方法有严重的不稳定性,如上图中的螺旋速度场,我们想得到的是一个做圆周运动的轨迹,但是最终结果得到的是粒子从速度场中偏离了出去,因为步长再小也是离散的,所以无论取多小的步长,最终这个粒子一定会偏离出去。而第二幅图的速度场,如果正确模拟,我们最终的粒子应该是沿着水平方向向右非处,但是我们看到的结果是上下来回的穿梭,这同样是欧拉方法的不稳定性造成的问题。
3.解决不稳定
(1)Midpoint Method—中点法
中点法,和欧拉方法类似,只不过做了一步改进,我们之前说欧拉方法的下一个点的位置是由上一个点的位置和速度决定的。中点法则不是,如上图,我们先同样的根据初始点的位置和速度计算出下一个点的位置和速度,但是我们不利用下一个点的位置和速度,我们取这两个点的中点的速度,然后用初始点的位置和中点的速度计算出下一个点的最终位置,因为速度场的变化在两点之间可能特别快,而中点的速度某种意义上来说比初始点更具有代表性。
中点法公式
(2)Adaptive Step Size—自适应步长
自适应步长法也顾名思义,我们之前说步长的长短决定了我们拟合出的效果好不好,那也就是说步长越短,也就拟合的越好。和中点法类似,对于一个步长Δt,我们计算出初始点经过Δt的位置xt,然后计算经过Δt/2的位置,再通过Δt/2位置的速度计算出再经过Δt/2的最终位置xt/2,如果xt和xt/2的位置差的很远,就说明我们取的步长过大了,所以要缩小步长,知道最终计算的两个结果相差在我们规定的范围内停下来,这就是自适应步长法。
(3)Implicit Euler Method—隐式欧拉方法
隐式的欧拉方法和显式的欧拉方法的不同之处在于,显示欧拉方法是根据上一个位置的信息去求解下一个位置的信息,隐式欧拉方法则是根据下一个点的信息去求,如上图。而下一个点的信息通常是未知的,我们要求解的是一个非线性的常微分方程,所以求解通常需要用到牛顿迭代法,这里不详细介绍,有兴趣的朋友自行了解。我们只需要知道,隐式的欧拉方法更稳定。
(4)稳定性的定义
我们一直提到稳定性,那么稳定性如何定义呢?通常人们会定义一个局部的误差,也就是每个步长产生的误差,而最终每个步长产生的步长加和得出的就是总体误差。人们用这两个误差来衡量稳定性。正常情况下,人们认为研究这两个数的大小是没有意义的,我们需要研究的是这两个数和Δt的关系,也就是阶数。通常用O(h)表示,上图给出了隐式欧拉方法的局部误差是O(h^2),总体误差是O(h),h就是Δt,阶数越高越好,因为阶数越高我们相应减少步长而减少的误差就越多。
(5)Runge-Kutta Families—龙格库塔法
龙格库塔法不是一个方法是一类方法,它们特别适合求解非线性的常微分方程,其中有一种龙格库塔的方法叫RK4用的最广泛,4就是4阶的意思,可想而知误差很小。
(6)Position-Based / Verlet Integration
Position-Based或者叫 Verlet Integration不是一种基于物理的方法,之所以被称为“非物理”的方法,是因为它们主要关注在给定时间步长下尽可能准确地模拟物体的运动,而不是严格遵循物理规律。实际应用中,这些简化和近似手段通常可以带来较好的性能和视觉效果。其核心思想是通过直接操作物体上的粒子的位置信息,从而达到约束物体运动的目的(调整位置从而满足某种限制)。当然因为不基于物理,它有时很难保证它符合能量守恒定律。
三、Rigid Body Simulation—刚体模拟
刚体的模拟非常简单,因为它不会发生弹性形变,这也就说明它内部所有的点的运动形式都是相同的,那这和单独一个粒子的模拟没什么太大的区别。只不过在刚体的模拟里,人们会更多的考虑其它的物理量,如上图,位置,朝向,速度,角速度对时间的导数。和粒子的模拟相比,无非是多了几个变量,我们同样可以用之前说的欧拉方法以及一系列方法去求解。
四、Fluid Simulation—流体模拟
接下来我们说流体模拟,来作为我们之前所说的非物理的Position-Based方法的例子。
首先我们认为,水体是由许多不可压缩的刚体小球组成的。
其次,假设水在任何一个地方都是不可压缩的,2L水不可能变成1L水,也就说任何位置密度都相同。
而第二个假设就给了我们这么一个根据位置去约束的条件,假设我们一开始平静的水面是各处密度相等的,一旦有一个位置水的密度发生了变化,那么根据我们的定义其它地方的小球也要跟着变化,从而来符合“各处密度都相等”这个条件。
1.欧拉方法和拉格朗日方法
在物理模拟中,模拟大规模的物质的两个思路:拉格朗日方法和欧拉方法。拉格朗日方法,俗称质点法就是我们上面提到的对于一大片水我们把它当成许多小水滴,然后我们找出每个小水滴的位置,最终整个水的位置就是正确的,或上图,我们模拟一群小鸟,把每个小鸟的位置都找出,我们就得出了整个鸟群的样子,当然这其中也会考虑它们之间的约束关系。 欧拉方法,或者叫网格法,我们把空间分成许多网格,我们考虑一个网格内随着时间如何变化,如上图,我们看一个网格,t-1的时间里网格里是蓝色的鸟,t时间是黑色鸟,t+1时间是橙色的鸟。两种方法的视角不同,拉格朗日视角是盯着物体看,欧拉视角是盯着空间看。
2.Material Point Method (MPM)—物质点法
当然,也有两种方法结合的方法,叫做物质点法,既考虑欧拉方法,又考虑拉格朗日方法。我们先假设物体的各个粒子都有各自的材质属性,比如密度等等,然后模拟它的运动过程,但是这些过程我们在格子中考虑,最终格子中记录的信息我们再写回粒子中。
3.小结
- 欧拉方法(Eulerian method)
欧拉方法是一种描述流体或者可变形物体运动的方法,在此方法中,观察者固定在空间中观察流经某个点的物质。这种方法关注的是每个固定点的状态变化,而不是跟随单个粒子的运动轨迹。在计算过程中,物质特性(如速度、密度等)被定义在一个固定的网格上。
- 拉格朗日方法(Lagrangian method)
拉格朗日方法与欧拉方法相反,它关注的是沿着单个粒子的运动轨迹的物质状态。观察者跟随物质粒子运动,聚焦于粒子随时间推移的属性变化。在拉格朗日视角下,物质特性(如位置、速度等)被定义在每个粒子上。
- 物质点方法(Material Point Method,MPM)
物质点方法(MPM)是一种将欧拉方法和拉格朗日方法结合起来的方法,它试图克服两者的局限性。在 MPM 中,物体被表示为一组离散的物质点,每个物质点携带了与其相关的物质特性(如密度、速度等)。物质点在一个固定的网格上进行计算,而后根据网格上的信息更新物质点的状态。
MPM 的主要步骤如下:
- 将物质点的物质特性(如质量、速度等)传递到固定的网格节点上。
- 在网格上求解物质的运动方程,例如牛顿第二定律。
- 根据网格节点的速度更新物质点的速度和位置。
- 重复以上过程直至计算结束。
总之,物质点方法利用了欧拉方法中固定网格的优势,使计算更加稳定;同时,通过拉格朗日方法对物质点的处理,能够捕捉物体的大变形和拓扑变化。
五、总结
这是本专栏的最后一篇文章,那么到这里GAMES101的所有内容基本上就都介绍完了,从光栅化到几何,到光线传播,以及相机透镜颜色空间这些,最后到动画与模拟,就都介绍完了,本篇主要简单介绍了利用欧拉方法以及其它改进的方法求解常微分方程的简单思路,以及刚体和流体的模拟,当然本篇只是简单介绍了一下,想更详细的了解还要靠大家自己,但是前面渲染的内容,介绍的已经相对详细了,尤其是MVP变换,我认为是本专栏中最详细的一篇,那么到这里就结束了,再见~
参考:
GAMES101_Lecture_22 (ucsb.edu)
Lecture 22 Animation Cont._哔哩哔哩_bilibili