2013-12-10 102 views
1

我想在OpenGL中繪製如下所示的形狀(黑色)(適用於桌面,不適用於手機)。我更喜歡3D,但2D也足夠了。我也會將紋理映射到它。過去我已經使用過三角形風扇/條帶來做其他事情,我想這就是我需要在這裏使用的,但我不確定從哪裏開始。我已經畫出了白色部分,但從來沒有反過來(黑色部分)。在使用什麼任何想法或指導(三角形扇,三角形帶,其他一些奇怪的OpenGL的形狀,我可能不知道的,等...)OpenGL中的拱門(2D或3D)

enter image description here

最終解決方案:

void draw_arch(GLfloat width, GLfloat height, GLint slices) 
{ 
    glPushMatrix(); 
     GLfloat offset = 0.5f; 
     glScalef(width/2,height/(1+offset),1.0f); 
     glBegin(GL_QUADS); 
     for(unsigned int i = 0; i < slices; ++i) { 
      float curAngle = ((i + 0)/(float)slices) * 3.14159; 
      float nxtAngle = ((i + 1)/(float)slices) * 3.14159; 
      glVertex2f(cos(curAngle), sin(curAngle)); 
      glVertex2f(cos(curAngle), 1.0f + offset); 
      glVertex2f(cos(nxtAngle), 1.0f + offset); 
      glVertex2f(cos(nxtAngle), sin(nxtAngle)); 
     } 
     glEnd(); 
    glPopMatrix(); 
} 

我可以調整「偏移量」變量來製作不同的拱形,但是在這個應用程序中,我選擇0.5來使它看起來像我想要的樣子!

再次感謝您的幫助!

+0

我們不是來做你的工作和/或研究。你需要自己去做,然後如果你遇到任何與編碼有關的問題,你可以問一個問題。 – Vallentin

+1

我會給你一個提示,其中大部分的三角形可能會有大部分三角形從左上角和右上角輻射出來,並按照沿圓弧周邊的順序產生三角形。你不能使用(單個)風扇,但是條形或一般三角形列表可以工作。 –

+0

@Vallentin我不是要求任何人爲我做,我只是要求一個開始的方向。即使是一個簡單的「你最好的選擇就是三角迷」也是一個可以接受的答案。爲了找到一個好的答案,我做了很多研究,但是搜索「opengl」和「arch」(或者這些的一些推導)最終導致了Arch Linux上的OpenGL的大量結果(試一試!)千萬不要在Stack Overflow上發佈一個問題,除非我已經用盡了所有的研究成果!看看我以前的問題,看看我不是一個學生試圖獲得作業問題的答案。我很感激不被視爲這樣! –

回答

1

生成圓的上半部分和其上的偏移,並與四邊形/三角形連接兩個:

hemicircle

#include <GL/glut.h> 
#include <cmath> 

void glShape(const float height, unsigned int segs) 
{ 
    glBegin(GL_QUADS); 
    for(unsigned int i = 0; i < segs; ++i) 
    { 
     float curAngle = ((i + 0)/(float)segs) * 3.14159; 
     float nxtAngle = ((i + 1)/(float)segs) * 3.14159; 
     glVertex2f(cos(curAngle), sin(curAngle)); 
     glVertex2f(cos(curAngle), 1 + height  ); 
     glVertex2f(cos(nxtAngle), 1 + height  ); 
     glVertex2f(cos(nxtAngle), sin(nxtAngle)); 
    } 
    glEnd(); 
} 

void display() 
{ 
    glClearColor(0, 0, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    double ar = w/h; 
    glOrtho(-2 * ar, 2 * ar, -2, 2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255, 0, 0); 
    glShape(0.1f, 20); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 

也許不是四邊形/三角形的數量降到最低,但它快速和簡單:)

+2

哇!這比我期待的要多得多,看起來工作得很好。我會做一些調整,以確保它,然後我會接受你的答案! –