Auf der Suche nach .NET 3D Physics Engine, die Mesh-Mesh-Kollisionen unterstützt

Ich suche nach einer Physik-Engine, die Kollisionen zwischen beliebigen Dreiecksnetzen verarbeiten kann. Die Leistung ist mir nicht besonders wichtig, die Simulation muss nicht in Echtzeit erfolgen. Ich möchte eine Simulation mit etwa 100-200 sich bewegenden Körpern durchführen, die insgesamt etwa 1.000.000 Dreiecke haben (die Netze könnten möglicherweise vereinfacht werden, wenn sich dies als notwendig erweist).

Bisher habe ich Jitter und BEPU ausprobiert. Ich habe es nicht geschafft, die Kollisionserkennung mit beiden zuverlässig zum Laufen zu bringen. Die Körper sinken nur langsam ineinander. Die meisten anderen Alternativen (wie Henge3D, JigLibX) unterstützen nur Netzformen für statische Objekte oder, wenn sie dynamische Netzkollisionsobjekte unterstützen, erlauben sie keine Kollisionen zwischen Netzobjekten.

Antworten (1)

(Entwickler von BEPUphysics hier)

DigitalRune oder Matali können tun, was Sie wollen. Ich habe keine direkte Erfahrung mit ihnen, aber sie sind beide ziemlich voll ausgestattet, soweit ich weiß.

Allerdings sollten BEPU und Jitter auch funktionieren. Wenn Sie in beiden dieselbe Art von Fehler sehen, liegt das Problem wahrscheinlich in der bereitgestellten Mesh-Geometrie oder Simulationskonfiguration, da es unwahrscheinlich ist, dass beide Engines denselben Fehler aufweisen.

Aus Sicht von BEPUphysics sind einige wahrscheinliche Übeltäter basierend auf der Beschreibung:

1) Inkonsistentes Wickeln in Dreiecken kombiniert mit einem einseitigen Kollisionsmodus, wodurch einige Dreiecke ziehen und andere schieben. Behebung: Stellen Sie sicher, dass alle Dreiecke eine gleichmäßige Windung haben, und verwenden Sie dann einen einseitigen Kollisionsmodus oder Solid.

2) Doppelseitige Dreiecke in Kombination mit ausreichend hohen Bewegung-gegen-Zeit-Schritten, damit Dreiecke die andere Oberfläche durchdringen und stecken bleiben können. Behebung: CCD aktivieren (langsamer und kann die Trennung nicht in allen Fällen garantieren) oder zu Solid oder konsistenter einseitiger Kollision wechseln (bevorzugt).

3) Grafiken, die von der physikalischen Darstellung abgesetzt sind, was zu einer scheinbaren (aber nicht tatsächlichen) Durchdringung zwischen Objekten führt. Behebung: Verwenden Sie eine der Engine zugeordnete Debug-Schublade, um zu überprüfen, ob die Simulation korrekt ausgeführt wird. Beispielsweise könnte in der BEPUphysicsDemos ein repräsentativer Test erstellt werden, um dessen Schublade zu nutzen.

4) Probleme bei der Simulationsskalierung. Wenn die Objekte extrem groß oder winzig sind, sind die eingebauten Schwellenwerte und Abstimmungsfaktoren nicht ideal. Behebung: Verwenden Sie so etwas wie ConfigurationHelper.ApplyScale (in den BEPUphysicsDemos), um die Simulation über die gewünschte Skalierung zu informieren.