OpenGL 2D рисование многоугольной формы и манипуляции? - PullRequest
11 голосов
/ 01 апреля 2012

Я работаю над проектом 2D-игры, где я ожидаю, что пользователи будут рисовать 2D-полигоны (замкнутый путь), такие как:

Explanation

Возможные решения:

1 - Рисование по точкам и расчет границ.1 Проблема - Расчет границ.

2 - Начните с эллипса и позвольте пользователю изменить его, перемещая вершины.2 Проблема - Когда эллипс увеличивается, он создает промежутки между вершинами, где вы не можете изменить форму.

3 - Добавить и переместить вершины3 Проблема - отсечение ушей Триангуляция застревает в какой-то момент (53-я строка while цикл @ http://pastebin.com/Ug337mH2, входит в бесконечный цикл)

** Подумав, я решил, что лучше поработать над бесконечным циклом (в методе 3) проблема, а не отказ от метода добавления и перемещения вершины.Что вызывает бесконечный цикл в цикле while в строке 53. (см. http://pastebin.com/Ug337mH2)?

Мое предположение: триангуляция обрезки ушей не может присоединить какую-либо вершину к какому-либо треугольнику и продолжает повторять попытки. **

Как мне легко реализовать рисование полигонов в моей игре?

1 Ответ

3 голосов
/ 01 апреля 2012

Используйте тесселятор 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
...