OpenGL 2D多边形形状绘制和操作?

时间:2012-04-01 14:52:02

标签: opengl 2d polygon libgdx

我正在开发一个2D游戏项目,我希望用户可以绘制2D多边形(封闭路径),例如:

Explanation

可能的解决方案:

1 - 按点绘制并计算边界线 1问题 - 边界线的计算。

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

3 - 添加和移动顶点
3问题 - 耳朵剪辑三角测量卡在某个点(第53行while循环@ http://pastebin.com/Ug337mH2,进入无限循环)

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

我的猜测:耳剪裁三角测量无法将某些顶点附加到任何三角形并继续重试。**

如何在游戏中轻松实现多边形绘制?

1 个答案:

答案 0 :(得分:3)

使用OpenGL tessellator:

  #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