物理引擎的计算顺序和迭代次数
-
05-07-2019 - |
题
我正在编写一个使用Verlet集成的物理引擎,但我无法使用一些约束来正常工作。一些(如粘合/焊接约束)是额外的“潮湿”。并且不够僵硬,而其他(如区域约束)是额外的弹性并且发送原子飞行。我的物理模拟器中的更新方法代码如下:
ProcessRemovedItems();
ProcessAddedItems();
_colliderManager.Update(timestepSize);
foreach (Atom atom in _atomList)
{
atom.Update(timestepSize);
}
for (int i = 0; i < _iterations; i++)
{
foreach (IConstraint constraint in _constraintList)
{
constraint.Update();
}
}
我已经尝试了所有不同的更新订单组合,没有帮助。我对使用迭代有一些模糊的想法,但不知道还有什么可以帮助。有什么建议吗?
解决方案
你对迭代的假设是正确的。
通过在一个帧中多次运行verlet积分器部件,模拟工作越硬越好。
这是由于以下原因: 假设你有5个原子彼此相邻,当最后一个原子被整合时,它会移动一点。不幸的是,它被移动到它旁边的原子。它需要一个完整的框架,在再次完成集成之前这是固定的(由于约束)。然而,有可能的是,原子再次被放置在其他原子中。
所以为了抵消这种影响,你做的迭代次数越多(所以每帧调用积分器的次数越多),模拟效果越好,并符合你的约束条件,
但是,您会注意到每帧运行积分器越多,它将使用的处理器功率就越大。因此,你必须手动找到一个最佳位置
不隶属于 StackOverflow