【问题标题】:OpenGL 2D polygonal shape drawing and manipulation?OpenGL 2D 多边形形状绘制和操作?
【发布时间】:2012-04-15 10:57:33
【问题描述】:

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

可能的解决方案:

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

2 - 从椭圆开始,让用户通过移动顶点来重塑它。
2 问题 - 当椭圆扩大时,它会在您无法重塑的顶点之间产生间隙。

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

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

我的猜测:剪耳三角测量无法将某个顶点附加到任何三角形并不断重试。**

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

【问题讨论】:

  • 用户绘制多边形的方式会受到限制吗?我的意思是会阻止他们创建与现有线相交的新线吗?
  • 实际上线相交是可以的……无论如何,它们将被分组为单独的三角形。所以我认为即使它们相交也会起作用。
  • 解决方案 3 运行良好,除了无限循环问题 :/ 。我对无限循环 pastebin.com/nw4ZAM7d 做了一个“假”修复,它忽略了导致无限循环的顶点。
  • 这是我在方法 3 中的成就 - fbcdn-sphotos-a.akamaihd.net/hphotos-ak-prn1/p480x480/…
  • 我唯一的问题是如何将“随机”线集细分为凹多边形本质上是不明确的,所以我假设您会阻止线相交。

标签: opengl 2d polygon libgdx


【解决方案1】:

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

【讨论】:

  • 我正在使用 libgdx,所以 glu 在这里非常有用。如果你知道镶嵌和三角测量是如何工作的,你能告诉我什么可能导致 earclippingtriangulator 类进入无限循环。三角剖分的顶点参数有什么规定吗?
  • @Ahmet:这不是过剩,而是过剩。不同的东西:)
  • 似乎我们在 libgdx 中有 glu 让我试试 ;)
  • glu in libgdx 只有这些功能(lookat、ortho2d、perspective、project、unproject):/
  • 我认为你是对的,我在 libgdx 中看不到任何对镶嵌的引用。很抱歉让您寄予厚望/误导了您。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2017-06-17
  • 2018-09-29
  • 2013-04-17
  • 2022-12-09
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多