3

Verlet 統合を使用する物理エンジンを作成していますが、いくつかの制約を正しく機能させることができません。いくつか (bond/weld 制約など) は余分な「水浸し」で十分に硬くありませんが、他のもの (領域制約など) は余分な弾みがあり、原子を飛ばします。私の物理シミュレーターでの更新方法のコードは次のようになります。

    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

反復の仮定は正しいです。

1 つのフレームで verlet インテグレーター パーツを複数回実行することにより、シミュレーションがより堅く、より適切に機能します)。

これは、次の理由によるものです。たとえば、5 つの原子が隣り合っており、最後の原子が統合されると、少し移動します。残念ながら、それは隣のアトムに移動されます。統合が再度行われる前に完全なフレームが必要であり、これは (制約により) 修正されます。ただし、可能性として、原子は再び他の原子の中に配置されます。

したがって、この効果に対抗するために、より多くの反復を行う (したがって、フレームごとにインテグレーターを呼び出す回数が多い) ほど、シミュレーションがより適切に機能し、制約に準拠します。

ただし、フレームごとに積分器を実行すればするほど、より多くのプロセッサ パワーが使用されることに気付くでしょう。そのため、手動で見つけなければならないスイートスポットがどこかにあります

于 2009-10-21T11:36:20.253 に答える