2012-04-01 12 views
9

Estoy trabajando en un proyecto de juego en 2D donde yo estoy esperando a los usuarios dibujar polígonos 2D (camino cerrado), tales como:Diagrama y manipulación de la forma poligonal OpenGL 2D?

Explanation

soluciones posibles:

1 - Dibujar Puntos y Calcular Líneas de frontera.
1 Problema - Cálculo de líneas de borde.

2 - Comience con una elipse y deje que el usuario la remodele moviendo vértices.
2 Problema: cuando la elipse se agranda, crea espacios entre los vértices donde no se puede cambiar la forma.

3 - Añadir y mover vértices
3 Problema - Ear stucks recorte de triangulación en somepoint (línea 53o while bucle @http://pastebin.com/Ug337mH2, entra en un bucle infinito)

** Después de pensarlo, decidí que mejor trabajo en el problema del bucle infinito (en el método 3) en lugar de abandonar el método de agregar y mover el vértice. ¿Qué causa el bucle infinito en el bucle while en la línea 53. (ver http://pastebin.com/Ug337mH2)?

Mi suposición: la oreja recorte triangulación no logra unir un poco de vértice a cualquier triángulo y va a continuar intentando **

¿Cómo puedo implementar fácilmente el dibujo de polígonos en mi juego.?

+0

es el usuario va a ser limitados en su forma de dibujar el polígono? Quiero decir, ¿se les impedirá crear una nueva línea que interseque una existente? – Robinson

+0

en realidad está bien que las líneas se crucen entre sí ... de todos modos se agruparán en triángulos separados. Entonces creo que funcionaría incluso si se cruzan. –

+0

solución 3 funciona bastante bien, excepto ese problema de bucle infinito: /. Hice un poco una corrección "falsa" para el bucle infinito http://pastebin.com/nw4ZAM7d ignora los vértices que causan el bucle infinito. –

Respuesta

2

tesselator del uso de 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, por lo que el glu es bastante de alcance aquí. Si sabes cómo funcionan la teselación y la triangulación, puedes decirme qué podría estar causando que la clase earclippingtriangulator vaya en bucle infinito. ¿Hay alguna regla sobre los parámetros de vértice para la triangulación? –

+0

@Ahmet: Eso no es exceso, eso es glu. Diferentes cosas :) –

+0

@StuartGolodetz gracias por la corrección;) –

Cuestiones relacionadas