質問

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