2012-04-01 6 views
9

Ich bin auf einem 2D-Spiel-Projekt arbeiten, wo ich Benutzer erwarten 2D Polygone (geschlossener Pfad), wie zu zeichnen:OpenGL 2D polygonale Form Zeichnung und Manipulation?

Explanation

Mögliche Lösungen:

1 - Zeichnen von Punkten und Berechnen Grenzlinien.
1 Problem - Berechnung der Grenzlinien.

2 - Beginnen Sie mit einer Ellipse und lassen Sie den Benutzer die Form ändern, indem Sie die Scheitelpunkte verschieben.
2 Problem - Wenn die Ellipse vergrößert wird, entstehen Lücken zwischen den Scheitelpunkten, an denen Sie nicht umformen können.

3 - Hinzufügen und Verschieben von Scheitel
3 Problem - Ear Clipping Triangulation stucks bei somepoint (53. Linie while Schleife @http://pastebin.com/Ug337mH2, geht in Endlosschleife)

** Nach einiger Überlegung entschied ich besser arbeiten das Problem mit der Endlosschleife (in Methode 3), anstatt die Methode zum Hinzufügen und Verschieben von Vertex aufzugeben. Was verursacht die Endlosschleife in der while Schleife bei 53. Zeile (siehe http://pastebin.com/Ug337mH2)?

Meine Vermutung: Ohr Clipping-Triangulation nicht etwas Vertex eines Dreieck und hält erneuten Versuch befestigen **

Wie ich leicht Polygon Zeichnung in meinem Spiel umsetzen kann.?

+0

Ist der Benutzer in zu gehen gezwungen, wie sie das Polygon zeichnen? Ich meine, werden sie daran gehindert, eine neue Linie zu schaffen, die eine bestehende Linie schneidet? – Robinson

+0

Eigentlich ist es in Ordnung, wenn Linien sich kreuzen ... sie werden sowieso in separate Dreiecke gruppiert. Also ich denke, es würde funktionieren, auch wenn sie sich schneiden. –

+0

Lösung 3 funktioniert ziemlich gut, außer dass Endlosschleife Problem: /. Ich habe ein "falsches" Update für Endlosschleife http://pastebin.com/nw4ZAM7d gemacht es ignoriert Scheitelpunkte verursacht Endlosschleife. –

Antwort

2

Verwenden OpenGL Tesselator:

#include <gl/gl.h> 
    #include <gl/glu.h> 
    #include <vector> 

    using namespace std; 

    typedef vector< vector< GLdouble* > > contours; 
    contours poly; 
    //Initialize poly here 

    GLUtesselator* tess = gluNewTess(); 
    gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK*)())&BeginCallback); 
    gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK*)())&VertexCallback); 
    gluTessCallback(tess, GLU_TESS_END, (void (CALLBACK*)())&EndCallback); 
    gluTessCallback(tess, GLU_TESS_COMBINE, (void (CALLBACK*)())&CombineCallback); 
    gluTessCallback(tess, GLU_TESS_ERROR, (void (CALLBACK*)())&ErrorCallback); 
    gluTessNormal(tess, 0.0, 0.0, 1.0); 
    gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); 
    gluTessProperty(tess, GLU_TESS_BOUNDARY_ONLY, GL_FALSE); //GL_FALSE 
    gluTessBeginPolygon(tess, NULL); 
    for (UINT i = 0; i < poly.size(); ++i) 
    { 
     gluTessBeginContour(tess); 
     for (UINT j = 0; j < poly[i].size(); ++j) 
     { 
      gluTessVertex(tess, poly[i][j], poly[i][j]); 
     } 
     gluTessEndContour(tess); 
    } 
    gluTessEndPolygon(tess); 
    gluDeleteTess(tess); // Delete after tessellation 
+0

Ich benutze libgdx, so Glu ist durchaus von hier zu erreichen.wenn Sie wissen, wie Tesselation und Triangulation funktioniert können Sie mir bitte sagen, was könnte verursachen, Ohr-Clipping-triangulator Klasse Endlosschleife zu gehen. Gibt es Regeln für Vertex-Parameter für die Triangulation? –

+0

@Ahmet: Das ist nicht Schwemme, das ist Glu. Verschiedene Dinge :) –

+0

@StuartGolodetz danke für die Korrektur;) –