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:
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?
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!
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.
Ich weiß nicht wirklich, was der beste Weg ist, aber hier , am Ende der Seite ist der Code für "Federn".