使用迭代函数和时间步长编码物理模拟

时间:2018-07-15 22:32:36

标签: math simulation physics game-physics skphysicsbody

我想创建一个物理模拟,其中的初始值将是所有物体的初始位置矢量,所有物体的初始速度矢量,所有物体的质量,所有物体的电荷,并且初始时间为0。

在模拟中计算两个物体之间的距离的距离公式应与欧氏空间中的距离公式相同。

任何物体与其他物体之间的力矢量将取决于两个物体的电荷乘以两个物体之间的距离f(距离)的函数乘以(该物体的位置矢量减去位置的乘积)的乘积另一个实体的向量)除以两个实体之间的距离。任何物体上的总力矢量将取决于其他物体上该物体上所有力矢量的总和。任何物体的加速度矢量都取决于该物体上的总力矢量除以该物体的质量。

在初始时间步长之后的每个时间步长中,每个物体的新位置矢量将取决于1/2乘以先前的加速度矢量乘以先前的时间步长平方再加上先前的速度矢量乘以先前的时间步长加先前的位置向量。新的速度矢量将取决于先前的加速度矢量乘以先前的时间步长加上先前的速度矢量。另外,新的时间流逝将取决于前一个时间流逝加上上一个时间步长。

如果我更改尺寸,添加新的物体,移除现有的物体,更改现有的物体的质量,更改现有的物体的电荷,则公式需要自动调整以继续匹配我之前所说的内容更改现有物体的位置矢量,更改现有物体的速度矢量或更改我前面提到的力公式中的距离函数。

模拟应该在三个以上的空间中起作用。同样,对于我在第三段中提到的距离f(distance)的函数,模拟应支持尽可能多的距离函数,包括距离的三角函数,例如距离的sin(distance)和cos(distance),双曲线距离的trig函数,例如距离的cosh(distance)和sinh(distance)多项式,距离的幂,例如e ^ distance,距离的对数,距离的Bessel函数,距离的误差函数,以及这些功能以及可能的其他功能的组合。

理想情况下,仿真应该有可能每分钟运行数百万个时间步长,以便使仿真快速,同时最大程度地减少仿真计算中的累积误差。

我该如何遵循以上所有标准编写物理模拟,哪种类型的程序最适合此类模拟?

1 个答案:

答案 0 :(得分:0)

让我们一次解决这些问题:

要处理任意数量的尺寸,您必须将位置,速度和加速度矢量存储为数组,然后将一些函数映射到这些数组上,而不是显式接受x,y和z或其他内容。

存储位置/速度/加速度/力阵列,并在某个对象或代表该对象的结构中充电,然后将所有这些存储在更大的阵列中,然后可以迭代计算力矢量,并更新力相应地排列。计算完所有力后,更新位置/速度/加速度,并重置力矢量。

为了满足精度和性能要求,您可能必须将此模拟编写为C之类的编译语言。此外,为了支持列出的所有距离功能,您可能需要组合使用查找表,算术技巧/近似值以足够快地获取值。

尝试首先写出所有公式,并查看可以应用的代数简化形式,以节省额外的计算步骤(是否可以将所有内容加倍以避免被二除,是否可以对某些东西求平方以避免平方根等等) )。知道除法远比乘法慢,并且平方根甚至更昂贵(请考虑距离幅度)。