2012-04-01 12 views
9

私は、ユーザーがのような2Dポリゴン(クローズドパス)を描画するために期待していた2Dゲームプロジェクトに取り組んでいます:OpenGL 2D多角形の描画と操作ですか?

Explanation

可能なソリューション:

1 - ドローポイントと計算によるとボーダーライン。
1問題 - 境界線の計算。

2 - 楕円で始まり、ユーザーが頂点を移動して楕円を再形成できるようにします。
2問題 - 楕円が拡大すると、変形できない頂点間に隙間ができます。

3 - 頂点を追加し、移動
3の問題 - somepointで耳クリッピング三角測量stucks(http://pastebin.com/Ug337mH2 @ 53thラインwhileループは、無限ループに入ります)

**いくつかの思考の後、私は私がよりよく働くことを決めました追加と移動の頂点メソッドを放棄するのではなく、無限ループ(方法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は非常に難しいです。もしあなたがどのようにテッセレーションと三角測量の仕事を知っていれば、earclippingtriangulatorクラスを無限ループにしているのか教えてください。三角形分割の頂点パラメータに関する規則はありますか? –

+0

@Ahmet:それはglutではない、それはgluだ。別のもの:) –

+0

@StuartGolodetz訂正ありがとうございました;) –

関連する問題