Я сделал несколько таких форм:
// Triangle
glBegin(GL_TRIANGLES);
glVertex3f(0.0,0.0,0);
glVertex3f(1.0,0.0,0);
glVertex3f(0.5,1.0,0);
glEnd();
// Cube using GLUT
glColor3f(0.0,0.0,1.0);
glutSolidCube(.5);
// Circle
glPointSize(2);
glColor3f(1.0,0.0,1.0);
glBegin(GL_POINTS);
float radius = .75;
for( float theta = 0 ; theta < 360 ; theta+=.01 )
glVertex3f( radius * cos(theta), radius * sin(theta), 0 );
glEnd();
Первоначально я сохраняю размер окна как 500x500
и вывод такой, как показано:
Однако, если я изменю ширину и высоту (не пропорционально) моего виджета, формы искажаются (круг выглядит овальным, равносторонний треугольник выглядит равнобедренным):
Это код обновления виджета:
void DrawingSurface::resizeGL(int width, int height)
{
// Update the drawable area in case the widget area changes
glViewport(0, 0, (GLint)width, (GLint)height);
}
Я понимаю, что могу сохранить саму область просмотра с той же шириной и высотой, но тогда много места будет потеряно по сторонам.
Q. Любое решение для этого?
В. Как разработчики игр справляются с этим в целом, проектируя игру OpenGL для разных разрешений?
Постскриптум Я понимаю, что это не современный OpenGL, а также есть лучшие способы сделать круг.
Они решают ее, используя матрицу проекции, и матрица перспективы, и ортопроекция традиционно имеют способ получения соотношения сторон (ширина / высота) и используют его для корректировки результата на экране.