物理エンジンの計算と反復の順序
-
05-07-2019 - |
質問
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つの原子があり、最後の原子が統合されると、少し移動します。残念ながら、その隣の原子に移動します。統合が再び行われる前に完全なフレームが必要であり、これは修正されます(制約のため)。しかし、可能性はありますが、原子は再び他の原子の内側に配置されます。
したがって、この効果に対抗するには、反復回数が多いほど(したがって、インテグレーターを呼び出すフレームごとの回数が多いほど)、シミュレーションがより適切に機能し、制約に適合します
ただし、フレームごとに積分器を実行するほど、より多くのプロセッサパワーが使用されることに気付くでしょう。そのため、手動で見つける必要があるスイートスポットがどこかにあります
所属していません StackOverflow