除了 Blender 写的关于使用牛顿方程的内容之外,您还需要考虑如何在“加速度场”上进行积分(正如您在对他的回答的评论中所说的那样)。
最简单的方法是使用Euler's Method。问题在于它会迅速发散,但它具有易于编码和相当快的优势。
如果您正在寻找更好的准确性,并且愿意牺牲一些性能,那么Runge-Kutta methods(可能是 RK4)之一通常是一个不错的选择。我会提醒你,如果你的“加速场”是动态的(即它会随着时间而变化......也许是由于行星在它们的轨道上移动的结果)RK4 将是一个挑战。
更新(基于下面的评论/问题):
如果要计算某个时间步t的力向量Fi(tn) n 应用于特定对象 i,然后您需要使用 Blender 引用的方程式计算模拟中所有其他对象贡献的力。也就是说,对于每个对象,i,您会计算出所有其他对象是如何拉(施加力)的,并且这些向量在求和时将是施加到 i 的总力向量.从算法上看,这看起来像:
对于每个对象 i
Fi(tn) = 0
对于每个对象 j ≠ i
Fi(tn) = Fi (tn) + G * mi * mj / |pi(tn)-p j(tn)|2
其中 pi(tn) 和 pj(tn) 是对象i和j在时间tn 分别和 | |是标准欧几里得 (l2) 法线...即两个对象之间的欧几里得距离。另外,G 是gravitational constant。
欧拉方法将模拟分解为离散的时间片。它着眼于当前状态,在您的示例中,考虑将所有力汇总到模拟中的所有对象,然后在时间片期间将这些力作为常数应用。使用时
ai(tn) = Fi(tn)/mi
(ai(tn) = t时刻的加速度矢量n sub>应用于对象i,Fi(tn)是在时间 tn 作用于物体 i 的力向量,mi 是物体 的质量i),力矢量(因此加速度矢量)在时间片的持续时间内保持不变。在您的情况下,如果您确实有另一种计算加速度的方法,则无需计算力,而是可以直接计算加速度。在任一情况下,在加速度保持恒定的情况下,时间 tn+1、p(tn+1) 和物体在时间 tn+1, v(tn+1) 的速度将由下式给出:
pi(tn+1) = 0.5*a i(tn)*(tn+1-tn) 2 + vi(tn)*(tn +1-tn)+pi(tn)
vi(tn+1) = ai(tn+1)*(tn+1-tn) + vi(tn)
RK4 方法将您的系统驱动程序拟合到一个 2 次多项式,该多项式可以更好地逼近其行为。详细信息在我上面引用的 wikipedia 站点上,您应该能够在网络上找到许多其他资源。基本思想是,不是为特定时间片选择单个力值,而是在特定时间计算四个力向量,然后将力向量拟合到二次多项式。如果您的力矢量场在时间片之间没有变化,那很好。如果您使用重力来导出矢量场,并且作为重力源的物体移动,那么您需要计算它们在四个子间隔中的每一个的位置,以便计算力矢量。可以做到,但你的表现会比使用欧拉方法差很多。从好的方面来说,您可以获得更准确的对象相对于彼此的运动。因此,从某种意义上说,这是一个挑战,因为它的计算成本很高,而且在迭代的时间片中找出四个样本的所有对象应该在哪里有点麻烦。