Мое приложение 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, но это не похоже на работу. Благодарю.
Матрица проекции преобразует все данные вершин из координат глаза в координаты клипа.
Затем эти координаты клипа также преобразуются в нормализованные координаты устройства (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
инструкции в конце вашего кода не должно быть.
Других решений пока нет …