簡體   English   中英

OpenGL 中的拱門(2D 或 3D)

[英]Arches (2D or 3D) in OpenGL

我正在嘗試在 OpenGL(對於台式機,而不是移動設備)中繪制如下所示的形狀(黑色)。 我更喜歡 3D,但 2D 也足夠了。 我也會將紋理映射到它。 我過去曾將三角扇/條用於其他用途,我想這就是我在這里需要使用的東西,但我不確定從哪里開始。 我之前畫過白色部分,但從來沒有畫過反面(黑色部分)。 關於使用什么的任何想法或指導(三角扇、三角帶、我可能不知道存在的其他一些奇怪的 OpenGL 形狀,等等......)

在此處輸入圖片說明

最終解決方案:

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 使它看起來像我想要的樣子!

生成一個圓的上半部分和它上面的一個偏移量,並用四邊形/三角形將兩者連接起來:

半圓

#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;
}

可能不是最少數量的四邊形/三角形,但它又快又容易:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM