我正在编写一个使用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个原子彼此相邻,当最后一个原子被整合时,它会移动一点。不幸的是,它被移动到它旁边的原子。它需要一个完整的框架,在再次完成集成之前这是固定的(由于约束)。然而,有可能的是,原子再次被放置在其他原子中。

所以为了抵消这种影响,你做的迭代次数越多(所以每帧调用积分器的次数越多),模拟效果越好,并符合你的约束条件,

但是,您会注意到每帧运行积分器越多,它将使用的处理器功率就越大。因此,你必须手动找到一个最佳位置

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top