Gibt es einfache (oder gut dokumentierte) Algorithmen für grundlegende CSG-Operationen an 2D-Polygonen?
Ich suche nach einer Möglichkeit, eine Reihe überlappender 2D-Kollisionsformen hinzuzufügen. Diese können konvex oder konkav sein, sind jedoch geschlossene Formen, definiert als eine Reihe von Liniensegmenten ohne Selbstschnittpunkte.
Die Verwendung davon wäre, einen sauberen Satz von Kollisionskanten zur Verwendung mit einer 2D-Physik-Engine aus einer Szene zu konstruieren, die aus vielen willkürlich platzierten (und häufig überlappenden) Objekten besteht, von denen jedes seine eigene Kollisionsform hat.
Zunächst muss ich nur Formen hinzufügen, aber die Fähigkeit zum Subtrahieren und Erstellen von Löchern kann auch nützlich sein.
2d
collision-detection
mathematics
geometry
csg
Bluescrn
quelle
quelle
Antworten:
Ist das für Level Designer oder für den Motor?
Für den Level-Designer benötigen Sie diesen Code, um z. B. statische Objekte zu kombinieren. Erforschen Sie vektorgrafische APIs für die Lösung. Die Aufgabe klingt für SVG, PostScript, WMF usw. ziemlich häufig. Versuchen Sie zuerst, die CombineRgn Win32-API zu verwenden :-)
Für die Spiel-Engine - ich würde vorschlagen, dass Sie nicht tun, was Sie wollen. Sie werden enorm viel CPU aufwenden, um Ihre Objekte miteinander zu kombinieren. Sie werden eine enorme Anzahl von Verzweigungsfehlvorhersagen damit verbringen, die Randbedingungen zu überprüfen, zu testen, ob sich 2 Segmente schneiden oder nicht usw. Dieser Vorgang muss in jedem Frame für den sichtbaren Teil Ihrer Karte wiederholt werden.
Führen Sie einfach Bounding-Box-Checks durch und kollidieren Sie dann mit einzelnen Objekten. Wenn Ihre Objektformen zu komplex sind, vereinfachen Sie sie beim Exportieren von Daten in die Engine und verwenden Sie verschiedene Formen für Kollisionen und Zeichnungen.
Update : Siehe meinen C # GDI + Code, der macht, was Sie wollen. Sie können dasselbe problemlos in C ++ schreiben: Die GraphicsPath-Klasse ist lediglich ein Thin Wrapper über die entsprechenden Funktionen von gdiplus.dll.
quelle
Ich habe einen kleinen Proof of Concept geschrieben, der CSG verwendet hat, um das Spiel im Stil von Scorched Earth / Worms zu verbessern. Ich habe es mit gluTessellate implementiert . Ich habe dann die tessellierten Dreiecke auf Box2D-Polygone abgebildet. Ich konnte sowohl Schmutz zur Simulation hinzufügen und daraus entfernen als auch Löcher bohren und füllen.
Das größte Problem bei der Verwendung von gluTessallate ist, dass es kein Problem gibt, entartete Dreiecke zurückzugeben. Ich musste diese herausfiltern, bevor ich die tessellierten Dreiecke in die Physik-Engine verschob.
Eines der schönen Dinge an gluTessallate ist, dass es möglich ist, die Nachbarschaft aus den Rückrufinformationen zu bestimmen. Ich bin nie weiter gegangen, aber theoretisch könnte man die Nachbarschaft und den SCC verwenden , um Inselbildung genau zu erkennen.
quelle
GLU_TESS_BOUNDRY_ONLY
. Der von mir bereitgestellte Link enthält einen kurzen Abschnitt speziell zu CSG.