物理引擎的计算顺序和迭代次数

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();
        }
    }

我尝试了所有不同的更新顺序,但都没有帮助。我有一个模糊的想法,关于使用迭代,但不知道还有什么其他方法可以帮助。有任何建议吗?


那么,您究竟想要实现什么目标呢?很难将您的代码与问题描述联系起来。您期望从代码中获得哪些输出? - o.k.w
我正在尝试让约束条件按照我的意愿进行。 - RCIX
1个回答

3
您的假设关于迭代是正确的。
通过在一个帧中多次运行Verlet积分器部分,模拟会更加稳定和优秀。
这是由于以下原因:
假设您有5个相邻的原子,当最后一个原子被积分时,它会被移动一点。不幸的是,它被移动到了旁边的原子中。在完整的帧之前,积分再次完成并进行修复(由于约束)。但是,很有可能原子再次被放置在其他原子内。
因此,为了抵消这种效应,您所做的迭代次数越多(每帧调用积分器的次数越多),模拟就会越好地符合您的约束条件。
然而,您会注意到,每帧运行积分器的次数越多,处理器使用的功率也越大。因此,需要手动找到某个最佳点。

在每个更新方法(约束、碰撞器管理器)中,我都添加了时间步长作为因子,然后再施加任何力之前将其乘以力,从而导致上述问题。:confused: - RCIX
你说得对...是我的错。我检查了我的资料,只有约束需要用多次迭代完成。当然,多次运行积分器会使模拟过快。 - Toad
这个想法仍然和我描述的一样...你需要多次运行约束条件,因为解决一个约束可能会导致另一个出错...所以你必须重新检查。 - Toad
谢谢,我会看看这些是否有帮助,并尽快回复您! - RCIX
你的约束代码为什么需要时间步长?约束始终按照相同的方式工作。例如:原子在墙上,然后将原子移动足够多的像素以使约束得到满足。如果原子发生相互碰撞,则使用从原子中心到原子2中心的线作为移动原子使其彼此分离的方向。 - Toad
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接