2012-04-01 51 views
9

我在2D游戏项目工作的地方,我希望用户绘制2D多边形(闭合路径),如:OpenGL 2D多边形外形绘制和操作?

Explanation

可能的解决方案:

1 - 由点及计算绘制边界线。
1问题 - 边界线的计算。

2 - 从一个椭圆开始,让用户通过移动顶点来重塑它。
2问题 - 当椭圆放大时,它会在无法重塑的顶点之间创建间隙。

3 - 添加和移动顶点
3问题 - 耳裁剪三角stucks在somepoint(第53行while环@http://pastebin.com/Ug337mH2,进入无限循环)

**经过一番思考,我决定我最好的工作无限循环(方法3中)的问题,而不是放弃添加和移动顶点方法。什么导致在53.行的while循环中出现无限循环(请参见http://pastebin.com/Ug337mH2)?

我的猜测:耳剪裁的三角未能一些顶点附加到任何三角形,并保持重试**

我怎么能轻松地实现在我的游戏多边形绘图?

+0

是用户将要在如何绘制多边形的限制?我的意思是他们会被阻止创建一条与现有相交的新线? – Robinson 2012-04-01 14:58:13

+0

实际上线条可以互相交叉......无论如何,它们将被分组为单独的三角形。所以我认为即使它们相交也是可行的。 – 2012-04-01 15:06:22

+0

解决方案3工作得很好,除了无限循环问题:/。我有点为无限循环做了一个“假”修复,它忽略了引起无限循环的顶点。 – 2012-04-01 15:19:49

回答

2

使用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

即时通讯使用libgdx,所以glu是相当到达here.if你知道如何tesselation和三角测量工作,你可以告诉我什么可能会导致earclippingtriangulator类去无限循环。三角测量的顶点参数是否有任何规则? – 2012-04-01 18:41:44

+0

@Ahmet:那不是过剩,那是glu。不同的东西:) – 2012-04-01 18:44:52

+0

@StuartGolodetz感谢您的更正;) – 2012-04-01 18:46:22