我有一个简单的物理引擎,可以通过直接校正重叠物体的位置(现在仅是圆形)来解决碰撞,而不仅仅是更改速度或施加脉冲。仅在影响已解决后或在集成过程中才更改速度。
我遇到的问题是,在对象堆中,顶部对象在堆底部的对象上施加了过多的压力(隐式存在,算法中没有压力建模),这导致它们被推过地板,等等
我想通过按其y坐标对对象进行排序来解决此问题,因此可以从下至上解决冲突。但是现在,引擎显示了实际上应该处于静止状态的对象的奇怪弹出行为(请参阅gif)
不只是提供源代码,这可能是什么?
我有一个简单的物理引擎,可以通过直接校正重叠物体的位置(现在仅是圆形)来解决碰撞,而不仅仅是更改速度或施加脉冲。仅在影响已解决后或在集成过程中才更改速度。
我遇到的问题是,在对象堆中,顶部对象在堆底部的对象上施加了过多的压力(隐式存在,算法中没有压力建模),这导致它们被推过地板,等等
我想通过按其y坐标对对象进行排序来解决此问题,因此可以从下至上解决冲突。但是现在,引擎显示了实际上应该处于静止状态的对象的奇怪弹出行为(请参阅gif)
不只是提供源代码,这可能是什么?
Answers:
我发现使用位置校正时的一种解决方案是进行几次迭代,并随着每次迭代改变强度。
doPhysics();
int num_iterations = 5;
for(int iteration=0; iteration<num_iterations; ++iteration)
{
float strength = float(iteration+1)/num_iterations;
correctPositions(strength);
}
因此,第一个迭代的强度为1 / num_iterations,而最后一个迭代的强度为1。这使得我的仿真比使用固定强度的相同数量的迭代更平滑,更稳定。
您的问题在于您的身体没有“静止”状态。任何物理系统都具有一定量的能量,包括动能,热能等等。实际上,固形物会发生轻微变形,并将一些动能转化为热量,尽管很难测量。还要指出的是,实际上不存在完全固态的物体。甚至像金刚石这样的致密材料,在原子之间也有空间,从而使原子结构有弯曲的空间并吸收了动能。
为了使这一点相关,静止的物体处于唯一起作用的状态为“法向力”的状态,也就是说,阻止物体彼此漂浮的力。法向力的大小与物体的密度以及它们相互穿透的距离成正比。
物理引擎将此值称为“ slope”。
诀窍是:根据两个物体的相对速度,计算坡度,校正物体的位置,并施加法向力。在更新物体本身的过程中,计算每个物体的动能。如果它低于最小值,则使身体进入睡眠状态,直到对其施加足够大的力为止。(通常是最小值的两倍)。