Wie kann ich eine normale, gitterbasierte 2D-Form in 3D extrudieren?

7

Ich habe eine Liste von Scheitelpunktkoordinaten, die mehrere 2D-Bereiche umfassen. Nur orthogonale Linien, aber nicht unbedingt konvexe Bereiche ... ähnlich wie Leiterplattenspuren von leitenden Kupferbereichen. Ich möchte sie mit OpenGL wie feste Objekte in 3D zeichnen, aber ich bin noch sehr neu in 3D und habe Probleme.

Bitte zeigen Sie mir, wie das geht. Ich habe es geschafft, den Umriss nur mit zu zeichnen GL_LINE_STRIP, aber wenn ich es versuche GL_QUAD_STRIPoder GL_TRIANGLE_STRIP, ist die Liste der Koordinaten für Dreiecksstreifen nicht richtig geordnet, und die Tatsache, dass die Bereiche nicht konvex sind, hindert mich daran, eine einfache dreieckige Tessellation durchzuführen.

Dies sind die 2D-Formen:

Illustration

Ich möchte sie so rendern:

Geben Sie hier die Bildbeschreibung ein

Hrvoje
quelle
Du hast recht, meine Überschrift ist etwas irreführend, es tut mir leid. Ich versuche im Grunde, einer 2D-Flächenkontur eine dritte Dimension hinzuzufügen. Ich habe die 2D-Koordinaten für den Umriss und möchte, dass er so aussieht: img4.yeggi.com/images_q/414287/tetris-blocks
Hrvoje

Antworten:

1

Es gibt drei Teile, um dies zu lösen;

  1. Tessellieren der konkaven Polygone in Dreiecke (opengl kann keine konkaven Polys zeichnen). Dies wird die "obere" Oberfläche sein

  2. Wenn Sie den Satz von Dreiecken entlang eines geeigneten Vektors verschieben (extrudieren), wird dies zur "unteren" Oberfläche

  3. 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.

Geben Sie hier die Bildbeschreibung ein

{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.

Ken
quelle
Ich denke, Sie verstehen die Frage entweder falsch oder was ein konvexes Polygon ist. In seiner Frage sagt er jedoch, dass die Bereiche nicht unbedingt konvex sind, was auch aus seinen Beispielen hervorgeht. Auch Ihre Beispielform ist nicht konvex, sondern konkav. Bitte setzen Sie Ihre Änderungen an der Frage zurück und aktualisieren Sie Ihre Antwort.
Christer
@Christer Ich habe konvex getippt, als ich konkav meinte, danke, dass du darauf hingewiesen hast.
Ken
Wenn alle OP-Formen einfach aus Quadraten bestehen, besteht eine andere Möglichkeit darin, nur 2 Dreiecke pro Quadrat für oben / unten auszugeben, anstatt Ohrschneiden durchzuführen.
HolyBlackCat
Ja, wenn die Formen auf einem Gitter basieren würden, wäre es ziemlich einfach, die Liste der Quadrate zu erstellen
Ken