2012-04-01 14 views
9

Sto lavorando su un progetto di gioco in 2D in cui mi aspetto utenti di disegnare poligoni 2D (percorso chiuso) come:Disegno e manipolazione di forme poligonali 2D OpenGL?

Explanation

Possibili soluzioni:

1 - Disegnare per Punti e Calcolare Linee di confine.
1 Problema - Calcolo delle linee di confine.

2 - Inizia con un'ellisse e consente all'utente di modificarlo spostando i vertici.
2 Problema: quando l'ellisse si allarga, crea spazi tra i vertici in cui non è possibile rimodellare.

3 - aggiungere e spostare vertici
3 Problema - Ear Clipping triangolazione stucks a somepoint (linea 53 ° while ciclo @http://pastebin.com/Ug337mH2, va in loop infinito)

** Dopo qualche pensiero, ho deciso che meglio lavorare su il problema del ciclo infinito (nel metodo 3) piuttosto che abbandonare il metodo di addizione e spostamento dei vertici. Che cosa causa il ciclo infinito nel ciclo while alla linea 53. (vedere http://pastebin.com/Ug337mH2)?

mia ipotesi: l'orecchio di ritaglio triangolazione non riesce ad attribuire una certa vertice ogni triangolo e mantiene riprovare **

Come posso implementare facilmente disegno del poligono nel mio gioco.?

+0

è l'utente sta per essere costretto nel modo di disegnare il poligono? Voglio dire che verrà loro impedito di creare una nuova linea che interseca quella esistente? – Robinson

+0

in realtà è ok per le linee che si intersecano tra loro ... saranno comunque raggruppate in triangoli separati. Quindi penso che funzionerebbe anche se si intersecano. –

+0

soluzione 3 funziona piuttosto bene tranne che il problema del ciclo infinito: /. Ho fatto una correzione "falsa" per il ciclo infinito http://pastebin.com/nw4ZAM7d ignora i vertici causando loop infinito. –

risposta

2

tesselator Usa OpenGL:

#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

im usando libgdx, quindi glu è abbastanza di portata qui.se sai come funziona la triangolazione e la triangolazione puoi per favore dirmi che cosa potrebbe causare un ciclo infinito alla classe earclippingtriangulator. Ci sono delle regole sui parametri dei vertici per la triangolazione? –

+0

@Ahmet: Non è glut, è glu. Cose diverse :) –

+0

@StuartGolodetz grazie per la correzione;) –