2012-04-01 76 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