opengl Рисовать овал, а не круг

если я вызову функцию 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;


person NPLS    schedule 27.06.2014    source источник
comment
Похоже на проблему с соотношением сторон окна просмотра или проекции. Правильно ли они установлены?   -  person Angew is no longer proud of SO    schedule 27.06.2014
comment
Не могли бы вы опубликовать свой код, показывающий, как вы настраиваете окно просмотра и т. Д.?   -  person rhughes    schedule 27.06.2014
comment
см. Обновление выше   -  person NPLS    schedule 27.06.2014


Ответы (2)


Скорее всего, у вас неправильно выровнены соотношения размеров окна и области просмотра.

Может быть полезен следующий ответ: 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);
person Łukasz Daniluk    schedule 27.06.2014
comment
я поставил glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); для полноэкранного эффекта текстуры, если я введу ваш код, экран станет черным - person NPLS; 27.06.2014
comment
Обратите внимание, что координаты границы теперь не (-1,1), а (widthX/2, heightY/2) => измените glVertex3f(-1.0f, -1.0f, 0.0f); на glVertex3f(-widthX/2.f, -heightY/2.f, 0.0f);, а остальное аналогично - person Łukasz Daniluk; 27.06.2014
comment
теперь фоновая текстура исчезла, но остался черный овал - person NPLS; 27.06.2014
comment
однако, если я поставлю этот glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-ширинаX/2, ширинаX/2, -высотаY/2, высотаY/2, ширинаX/2, высотаY/2); glLoadIdentity(); , я вижу, что я писал раньше, но если я напишу это glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-ширинаX/2, ширинаX/2, -высотаY/2, высотаY/2, ширинаX/2, высотаY/2); экран черный, поэтому мне нужно поставить два glLoadIdentity(), чтобы что-то увидеть - person NPLS; 27.06.2014
comment
Как я уже сказал, вы также должны изменить свои координаты в вершинах, чтобы мой код работал правильно: 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 как радиус окружности. - person Łukasz Daniluk; 27.06.2014
comment
я сделал это, но экран черный - person NPLS; 27.06.2014
comment
если я поставлю этот двойной w = glutGet(GLUT_WINDOW_WIDTH)/300.0; двойной ч = переварить (GLUT_WINDOW_HEIGHT) / 300,0; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(-1 * ш, 1 * ш, -1 * ч, 1 * ч, 10, -10); =› круг - это круг, и он работает, но текстура фона меньше и не закрывает окно - person NPLS; 27.06.2014
comment
если я изменю это: glOrtho(-1 * w/2, 1 * w/2, -1 * h/2, 1 * h/2, w/2, -h/2); , фоновая текстура больше, но не закрывает стороны окна - person NPLS; 27.06.2014
comment
Спасибо, это работает !! , я поставил двойной w = glutGet (GLUT_WINDOW_WIDTH) / 300,0; двойной ч = переварить (GLUT_WINDOW_HEIGHT) / 300,0; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(-1 * ш/2, 1 * ш/2, -1 * ч/2, 1 * ч/2, ш/2, -ч/2); и ==› ваш совет glVertex3f(-w/2.f, -h/2.f, 0.0f); - person NPLS; 27.06.2014
comment
Здорово, что ты заставил это работать. Если вам нужны какие-либо объяснения или дополнительная помощь, не стесняйтесь обращаться ко мне. - person Łukasz Daniluk; 28.06.2014

В предыдущем ответе показан один из способов получения круга с побочным эффектом изменения ваших координат. Я думаю, что это решение в целом более удобно, так как вы все равно можете рисовать с теми же координатами, которые у вас уже были:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double aspectRatio = (double)width / (double)height;
glOrtho(-aspectRatio, aspectRatio, -1.0, 1.0, -1.0, 1.0);
person Reto Koradi    schedule 27.06.2014
comment
работает, но фон не закрывает все окно - person NPLS; 27.06.2014
comment
При вызове glClear() не очищается весь фон? В это трудно поверить. Очищенная область не подвергается преобразованиям. Единственный способ ограничить пиксели, очищенные glClear(), — это проверка ножницами. - person Reto Koradi; 28.06.2014