物理引擎中的时间积分方法及求解
介绍常用的时间积分方法,及最终的求解过程。
0 物理系统描述
在物理引擎中,借助牛顿第二运动定律对系统进行描述,即
有时候也会用
上述方程就是物理引擎中的 ODE 部分。该方程组的解法主要有显式(Forward Euler、Semi-implicit Euler)、隐式(Backward Euler)等。
1、时间积分方法
在仿真计算过程中,已知模型中节点在
1.1 显式时间积分(Explicit / Forward Euler)
计算方式如下:
在该方法中,由模型中节点的位置
1.2 半隐式积分(Explicit / Semi-implicit Euler aka. Symplectic Euler)
计算方式如下:
在该方法中,同样由模型中节点的位置
Tips:Forward Euler 和 Semi-implicit Euler 略微不同,在计算
1.3 仿真流程(显式积分)
在使用显式(Forward Euler or Semi-implicit Euler)进行仿真的时候,仿真流程有如下几个步骤:
- 计算节点受力
- 计算新的速度
- 碰撞检测(此时会更正速度)
- 计算新的位置
(Semi-implicit Euler)
显式时间积分器的性能缺陷: Easy to explore
关于稳定性 Stability 和爆炸 Explode 问题:
(略)
1.4 隐式积分(implicit Euler)
计算方式如下:
亦或者记作如下的形式
上述系统方程,可以转化成一个非线性的偏微分方程(PDE),通常有两种思路:(1)化简消去
(1)隐式积分求解 - 消去
化简消去
这是一个关于
(2)隐式积分求解 - 消去
化简消去
这是一个关于
Tips:在这里,消去
2 物理引擎中 PDE 的求解
如第 1 节中看到,在物理仿真中,通过空间上的离散化,计算得到了模型中节点上的受力
(在物理引擎中,会得到各种 ODE、PDE、线性系统、非线性系统,名称上比较混乱。)其中涉及的求解方法也非常多,比如,线性化、牛顿法、Jacobin、CG(Conjugate Gradient)、优化隐式方法等等,非常多样
2.1 线性化(one step of Newton's method)
简单地求解,可以实现一步牛顿法,将
(1)速度上的求解
操作之后,系统变成了线性系统。整理之后,为
(2)位置上的求解
这里不是很确定,还需要再对照资料确认一下。
如上所述,线性化之后会得到如下的线性系统:
对该线性系统的求解,可以采用 Jacobin / Gauss-Seidel iterations,或者 Conjugate gradients 等方法进行求解。
Jacobin iteration 求解线性系统的方法
单步的 Jacobin 迭代过程如下所示:
A = []
x = []
new_x = []
b = []
@ti.kernel
def iterate():
for i in range(n):
r = b[i]
for j in range(n):
if i != j:
r -= A[i,j] * x[j]
new_x[i] = r / A[i,i]
for i in range(n):
x[i] = new_x[i]
Jacobin 迭代的思想就是,每次只让一行(一个点)满足该方程,依次计算完成,就能让所有的点都(曾经)满足方程。多迭代几次,就能接近线性方程组的解了。(大概是这么个意思吧)
2.2 线性化(one step of Newton's method) - 进阶
在上节所述的线性系统中,加入一个系数
其中,当
当
当
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗