【问题标题】:opengl Draw Oval not Circleopengl绘制椭圆而不是圆形
【发布时间】:2014-06-27 23:45:35
【问题描述】:

如果我调用函数 DrawFilledCircleo() 它会生成一个椭圆而不是圆形,即使我输入 glBegin(GL_LINE_LOOP);它总是使椭圆形

void drawFilledCircle(GLfloat x, GLfloat y, GLfloat radius){
    int i;
    int triangleAmount = 20; //# of triangles used to draw circle

    //GLfloat radius = 0.8f; //radius
    GLfloat twicePi = 2.0f * PI;

    glBegin(GL_TRIANGLE_FAN);
        glVertex2f(x, y); // center of circle
        for(i = 0; i <= triangleAmount;i++) { 
            glVertex2f(
                    x + (radius * cos(i *  twicePi / triangleAmount)), 
                y + (radius * sin(i * twicePi / triangleAmount))
            );
        }
    glEnd();
}

我尝试了不同的函数来绘制圆圈,但它总是生成椭圆。

我把它放在:

static void Draw(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glViewport(0, 0, widthX, heightY);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    texture[0] = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
    (
        "img.jpg",
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
         SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT
    );
// allocate a texture name
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_POLYGON);

    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  0.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  0.0f);

    glEnd();

    drawFilledCircle(0.5f,0.5f,0.1f);

    glutSwapBuffers();
}

更新:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInit(&argc, argv);
    glutInitWindowSize(widthX, heightY);
    glutCreateWindow("earthQuake");
    glutReshapeFunc(resize);
    glutDisplayFunc(Draw);
    glutKeyboardFunc(keyPressed);
    glutKeyboardUpFunc(keyUp);
    /////////////////////////////////////
    glEnable(GL_TEXTURE_2D);
   // glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    //glClearDepth(1.0f);
    //glEnable(GL_DEPTH_TEST);
   // glDepthFunc(GL_LEQUAL);
   glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glutMainLoop();

宽度X = 800;高度Y = 400;

【问题讨论】:

  • 看起来像视口或投影纵横比问题。这些设置是否正确?
  • 您能否发布您的代码以显示您如何设置视口等...?
  • 见,上面的更新

标签: c++ opengl math geometry geometry-shader


【解决方案1】:

很可能您的视口和窗口大小比例未对齐。

以下答案可能会有所帮助: https://stackoverflow.com/a/15725280/3301533

编辑:

感谢这段代码:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

你有你的椭圆形。尝试将其更改为:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-widthX/2, width/X2, -heightY/2, heightY/2, -1, 1);

【讨论】:

  • 我把 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity();对于全屏纹理效果,如果我输入您的代码,屏幕会变黑
  • 请注意,边界坐标现在不是 (-1,1),而是 (widthX/2, heightY/2) => 将 glVertex3f(-1.0f, -1.0f, 0.0f); 更改为 glVertex3f(-widthX/2.f, -heightY/2.f, 0.0f);,其余的以此类推
  • 现在背景纹理消失了,但黑色椭圆仍然存在
  • 然而,如果我把这个 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-widthX/2, widthX/2, -heightY/2, heightY/2, widthX/2, heightY/2); glLoadIdentity(); ,我看到我之前写的,但是如果我写这个 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-widthX/2, widthX/2, -heightY/2, heightY/2, widthX/2, heightY/2);屏幕是黑色的,所以我必须放两个 glLoadIdentity() 才能看到一些东西
  • 正如我所说,您也必须将顶点坐标更改为我的代码才能正常工作:glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); 应该成为 glTexCoord2f(0.0f, 0.0f); glVertex3f(-widthX/2.f, -heightY/2.f, 0.0f); 等其他人。并尝试将 50.f 作为圆半径传递。
【解决方案2】:

上一个答案显示了一种获得圆的方法,其副作用是必须更改坐标。我认为这种解决方案通常更方便,因为您仍然可以使用已有的相同坐标进行绘制:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double aspectRatio = (double)width / (double)height;
glOrtho(-aspectRatio, aspectRatio, -1.0, 1.0, -1.0, 1.0);

【讨论】:

  • 可以,但是背景没有覆盖整个窗口
  • 调用glClear()时不清除整个背景?这很难相信。被清除的区域不受变换的影响。限制glClear()清除的像素的唯一方法是剪刀测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2022-01-09
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2016-02-05
相关资源
最近更新 更多