2012-04-01 12 views
9
내가 같은 2 차원 다각형 (닫힌 패스) 그릴 사용자를 기대하고 어디는 2D 게임 프로젝트에서 일하고 있어요

:OpenGL 2D 다각형 모양 그리기 및 조작?

Explanation

가능한 해결책 :

1 - 포인트 및 계산에 의해 그리기 테두리 선.
1 문제 - 테두리 선 계산.

2 - 타원으로 시작하고 사용자가 정점을 이동하여 모양을 바꿀 수있게하십시오.
2 문제점 - 타원이 커지면 모양을 바꿀 수없는 꼭지점 사이에 틈이 생깁니다.

3 - 추가 및 이동 정점을
3 문제 - 귀 클리핑 삼각 stucks somepoint에서 (53th 라인 while 루프 http://pastebin.com/Ug337mH2 @, 무한 루프로 전환)

어떤 생각 후에, 나는 더 나은에 일을 결정 **

추가 및 이동 버텍스 메서드를 포기하는 대신 무한 루프 (방법 3) 문제. 53. 라인에서 while 루프의 무한 루프가 발생하는 이유는 무엇입니까 (http://pastebin.com/Ug337mH2 참조)?

내 생각 엔 : 귀 클리핑 삼각형은 삼각형에 약간의 정점을 연결하는 데 실패하고 재 시도를 계속 **

를 내가 쉽게 내 게임에 다각형 그리기를 구현하는 방법에 대해 설명합니다.?

+0

이가는 사용자에 제약을받을 수 있나요? 나는 기존의 것들과 교차하는 새로운 라인을 만들지 못하게 될 것인가? – Robinson

+0

실제로 선이 서로 교차하는 것은 괜찮습니다 ... 어쨌든 그들은 별도의 삼각형으로 그룹화됩니다. 그래서 나는 그들이 교차하더라도 작동 할 것이라고 생각합니다. –

+0

솔루션 3은 무한 루프 문제를 제외하고는 꽤 잘 작동합니다. 나는 무한 루프를위한 "가짜"픽스를 만들었습니다. http://pastebin.com/nw4ZAM7d 무한 루프를 일으키는 버텍스를 무시합니다. –

답변

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는 꽤 도달 할 수 있습니다. 만약 당신이 tesselation과 삼각 측량 작업을 알고 있다면, earclippingtriangulator 클래스가 무한 반복을하게하는 원인이 무엇인지 말해 줄 수 있습니다. 삼각형 분할을위한 버텍스 매개 변수에 대한 규칙이 있습니까? –

+0

@ 아멧 : 그건 과대하지 않습니다. 다른 것들 :) –

+0

@StuartGolodetz 정정 주셔서 감사합니다;) –

관련 문제