Es gibt drei Teile, um dies zu lösen;
Tessellieren der konkaven Polygone in Dreiecke (opengl kann keine konkaven Polys zeichnen). Dies wird die "obere" Oberfläche sein
Wenn Sie den Satz von Dreiecken entlang eines geeigneten Vektors verschieben (extrudieren), wird dies zur "unteren" Oberfläche
Erzeugen der ‚Seiten‘ des Bandes, durch das Verbinden nach oben
außen Ränder oben und unten Oberflächen
Teil 1 - Tessellation der Oberseite
Die einfachste Antwort für konkave Polygontessellation ohne Löcher ist EAR-Clipping.
{v3, v0, v1} & {v1, v2, v3} sind Ohren, {v0, v1, v2} ist kein Ohr (v3 liegt in {v0, v1, v2}), {v2, v3, v0) ist kein Ohr (der Innenwinkel bei v3 ist> π). Ein EAR eines Polygons ist ein Dreieck, das aus drei aufeinanderfolgenden Eckpunkten V0, V1 und V2 besteht, für die V1 ein konvexer Scheitelpunkt ist (der Innenwinkel am Scheitelpunkt ist kleiner als π Radiant). Das Liniensegment von Vi0 nach Vi2 liegt vollständig innerhalb des Polygon und keine anderen Eckpunkte des Polygons sind in dem Dreieck enthalten als die drei Eckpunkte des Dreiecks. Ein Polygon mit 4 oder mehr Eckpunkten hat immer ein Ohr. Unser Ansatz ist es also, ein Ohr zu finden, es abzuhacken und zu wiederholen, bis nur noch ein Ohr (Dreieck) übrig ist.
do until num vertices of P is 3
find an ear vq,vr,vs
add vq,vr,vs to list of triangles
remove vr from polygon
end do
add last 3 vertices to triangle list
Zeichnen Sie diese Liste als GL_TRIANGLE_LIST
Es gibt effizientere Ansätze für die Polygon-Triangulation ( https://en.wikipedia.org/wiki/Polygon_triangulation ), aber die Ohrmethode ist bei weitem die einfachste.
Teil 2 - Bodenfläche erzeugen
Kopieren Sie alle in Teil 1 gefundenen Scheitelpunkte und fügen Sie jedem Ihren Extrusionsvektor hinzu. Dies wird Ihre "untere" Oberfläche. Der Extrusionsvektor ist ein Vektor (normalerweise) im rechten Winkel zu Ihrem ursprünglichen Polygon. Die Länge des Extrusionsvektors hängt davon ab, wie lang Ihre Extrusion sein muss.
Teil 3 - Extrusionsseiten erzeugen
Nehmen Sie jede Kante Ihres ursprünglichen konkaven Polygons. Fügen Sie den Extrusionsvektor zu den beiden Endpunkten der Kante hinzu. Dies erzeugt 4 Punkte (2 ursprüngliche Endpunkte und 2 "extrudierte" Endpunkte). Diese bilden ein Rechteck *, das eine der Seiten der Extrusion ist. Diese können je nach Reihenfolge als GL_QUADS oder GL_TRIANGLE_STRIP gezeichnet werden.
* Annahme eines rechtwinkligen Extrusionsvektors.