OpenGL рисует овал вместо круга

Мое приложение openGL рисует круг в виде овала, а не круга. Мой код:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();

glOrtho(0.0f, 800, 0.0f, 400, 0.0f, 1.0f);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();

glColor3f(255.0, 255.0, 255.0);
drawRect(racket_left_x, racket_left_y, racket_width, racket_height);
drawRect(racket_right_x, racket_right_y, racket_width,
racket_height);
glPopMatrix();

// drawBall();
//drawBall2();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
drawBall();

glPopMatrix();
glPopMatrix();

glutSwapBuffers();

Как я могу это исправить?

Я попытался изменить glMatrixModes, но это не похоже на работу. Благодарю.

2

Решение

Матрица проекции преобразует все данные вершин из координат глаза в координаты клипа.
Затем эти координаты клипа также преобразуются в нормализованные координаты устройства (NDC) путем деления на w компонент координат клипа.
Нормализованные координаты устройства находятся в диапазоне (-1, -1, -1) до (1, 1, 1).

В ортографической проекции координаты пространства глаза линейно отображаются в НЦД.

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

int wndWidth  = 800;
int wndHeight = 400;
glOrtho( 0.0, (float)wndWidth, 0.0, (float)wndHeight, -1.0, 1.0 );

Если область просмотра является прямоугольной, это необходимо учитывать путем сопоставления координат.

float aspect = (float)widht/height;
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);

Вы устанавливаете правильную матрицу проекции размера окна, прежде чем рисовать прямоугольники (drawRect)

glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 800, 0.0f, 400, 0.0f, 1.0f);

.....

drawRect( ..... );

Но вы «очищаете» матрицу проекции и делаете не перед тем, как нарисовать круг, позаботьтесь об аспекте вида (drawBall).

Измените свой код так:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

float aspect = 800.0f/400.0f;
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);

drawBall();

Кстати, пока glPushMatrix вставить элемент в стек матрицы, glPopMatrix вытолкнуть элемент из стека матрицы. В OpenGL есть один стек матрицы для каждого режима матрицы (см. glMatrixMode). Матричные режимы GL_MODELVIEW, GL_PROJECTION, а также GL_TEXTURE и все матричные операции применяются к стеку матриц, указанному вами glMatrixMode.
Это означает, что оба glPopMatrix инструкции в конце вашего кода не должно быть.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]