Nicht-starre Körper 2D-Physik-Engines in C ++

8

Ich versuche mit 2D-Physik-Engines in C ++ zu experimentieren. Bisher scheint die beliebteste Box2D zu sein. Leider ist Box2D eine starre Körperphysik-Engine, und das wird mir nicht wirklich helfen, was ich ausprobieren will.

Ich möchte eine Form definieren können, die eine Anzahl von Scheitelpunkten hat, die durch Federn verbunden sind, so dass, wenn diese Form mit starren oder anderen nicht starren Formen kollidiert, ihre Form flexibel ist.

Nun habe ich versucht, in Box2D nur mit starren Körpern zu arbeiten, aber es scheint immer Fehler zu geben:

  1. Verwenden Sie Rechtecke oder Liniensegmente für die äußeren Kanten der flexiblen Form. Diese werden mit anderen Formen kollidieren. Leider sind sie nicht federnd, so dass der gewünschte Effekt nicht zu sehen wäre.
  2. Jeder Scheitelpunkt der Form könnte ein Körper mit einer eigenen kleinen Kreisform sein. Diese Körper können dann durch Federn zusammengefügt werden. Dies würde im Hinblick auf die Verformung der Form gut funktionieren, aber stellen Sie sich vor, wenn die Form auf einem starren Dorn landet und der Dorn gerade zwischen den Eckpunkten passiert. Dann würde die Form auf dem Dorn stecken bleiben.

Was ist der beste Weg, um diese Art von Physik in C ++ zu machen? Am liebsten ohne eine komplette Physik-Engine schreiben zu müssen. Vielleicht fehlt mir nur eine Funktion von Box2D. Vielleicht ist es einfach nicht die richtige Wahl. Was ist dann die richtige Wahl?

    
Joseph Mansfield 16.07.2010, 22:12
quelle

4 Antworten

3

Es gibt mehrere Pakete / Engines, die deformierbare / weiche Körper unterstützen. Wenn Sie etwas frei haben wollen, können Sie zum Beispiel Phyz , SOFA oder Bullet .

Es gibt eine detaillierte Auflistung auf Wikipedia . Die meisten davon sind 3D-basiert, aber Sie können sie an ein 2D-Modell anpassen, indem Sie die Szene als Ebene einrichten.

Glückliche Kodierung!

    
Staffan E 26.07.2010, 14:57
quelle
1

Ich denke Dax Phyz hat sowohl 2D als auch weiche Körper.

    
Escargot 24.02.2011 22:52
quelle
1

Wenn Sie nur nach Deformation suchen, würde ich vorschlagen, ein Polygonmodell (trimesh) zu verwenden, wo ich Kollisionsrückrufe zu dem starren Körper fangen würde, der diese Form darstellt. Auf dem Kollisionspunkt würde ich das Ausmaß der Verformung bestimmen, die an einer oder mehreren Ecken verursacht wird.

Für eine Deformation würde ich vorschlagen, dass Sie bei jedem Zeitschritt durch Ihre deformierten Punkte iterieren und versuchen, sie nach außen zu drücken. Ich nehme an, die Abfrage könnte durch sehr kleine Sphärenabfragen in Ihrer Kollisionswelt erfolgen. Das würde auch erfordern, dass Sie eine "maximale" undeformierte Position behalten.

Diese Methode wäre ziemlich einfach zu implementieren, obwohl es kein "weicher Körper" wäre, der das sein könnte, wonach Sie suchen. Ссылка scheint eine Implementierung zu sein, die den gewünschten Quellcode ausgibt zu sehen.

    
Simon 22.07.2010 00:07
quelle
0

Ich weiß nicht wirklich, was der beste Weg ist, aber hier , am Ende der Seite ist der Code für "Federn".

    
Dr. belisarius 20.07.2010 05:28
quelle

Tags und Links