3

我正在编写一个使用 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();
        }
    }

我已经尝试了所有不同的更新命令组合,但没有任何帮助。我对使用迭代有一个模糊的想法,但不知道还有什么帮助。有什么建议么?

4

1 回答 1

3

您对迭代的假设是正确的。

通过在一个框架中多次运行 verlet 积分器部分,模拟的效果越强越好)。

这是由于以下原因:假设您有 5 个彼此相邻的原子,当最后一个原子被积分时,它会移动一点。不幸的是,它被移到了它旁边的原子上。它需要一个完整的帧,然后再次完成集成并且这是固定的(由于约束)。然而,很有可能,原子再次被放置在其他原子内部。

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

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

于 2009-10-21T11:36:20.253 回答