2012-04-01 14 views
9

Tôi đang làm việc trên một dự án game 2D mà tôi đang mong đợi người dùng để vẽ đa giác 2D (đường dẫn khép kín) như:Bản vẽ hình dạng đa giác OpenGL 2D và thao tác?

Explanation

Giải pháp có thể:

1 - Vẽ bằng điểm và Tính Đường viền.
1 Sự cố - Tính toán đường biên giới.

2 - Bắt đầu bằng hình elip và cho phép người dùng định hình lại bằng cách di chuyển các đỉnh.
2 Vấn đề - Khi hình elip phóng to, nó tạo ra những khoảng trống giữa các đỉnh mà bạn không thể định hình lại.

3 - Thêm và Move Vertices
3 Vấn đề - Tai Clipping tam giác stucks tại somepoint (dòng 53th while loop @http://pastebin.com/Ug337mH2, đi vào vòng lặp vô hạn)

** Sau một vài suy nghĩ, tôi quyết định tốt hơn làm việc trên vấn đề vòng lặp vô hạn (trong phương thức 3) thay vì bỏ qua phương thức thêm và di chuyển đỉnh. Điều gì gây ra vòng lặp vô hạn trong vòng lặp while ở dòng 53. (xem http://pastebin.com/Ug337mH2)?

tôi đoán: tai cắt tam giác thất bại trong việc đính kèm một số đỉnh với bất kỳ hình tam giác và tiếp tục thử lại **

Làm thế nào tôi có thể dễ dàng thực hiện vẽ hình đa giác trong trò chơi của tôi.?

+0

là người dùng sẽ bị hạn chế trong cách họ vẽ đa giác? Tôi có nghĩa là họ sẽ được ngăn chặn từ việc tạo ra một dòng mới mà cắt một đường hiện có? – Robinson

+0

thực sự nó là ok cho các dòng để cắt nhau ... họ sẽ được nhóm lại thành hình tam giác riêng biệt anyway. Vì vậy, tôi nghĩ rằng nó sẽ làm việc ngay cả khi họ giao nhau. –

+0

giải pháp 3 hoạt động khá tốt ngoại trừ vấn đề vòng lặp vô hạn: /. Tôi đã thực hiện một sửa chữa "giả" cho vòng lặp vô hạn http://pastebin.com/nw4ZAM7d nó bỏ qua các đỉnh gây ra vòng lặp vô hạn. –

Trả lời

2

Sử dụng OpenGL của 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

im bằng cách sử dụng libgdx, vì vậy glu là khá đạt được ở đây. Nếu bạn biết cách tesselation và triangulation hoạt động, bạn có thể vui lòng cho tôi biết những gì có thể gây ra earclippingtriangulator lớp để đi vòng lặp vô hạn. Có bất kỳ quy tắc nào về tham số đỉnh cho tam giác không? –

+0

@Ahmet: Đó không phải là glut, đó là glu. Những điều khác nhau :) –

+0

@StuartGolodetz cảm ơn sự điều chỉnh;) –