Сохранение геометрии без изменений при изменении размера экрана

Я сделал несколько таких форм:

// 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, а также есть лучшие способы сделать круг.

0

Решение

Они решают ее, используя матрицу проекции, и матрица перспективы, и ортопроекция традиционно имеют способ получения соотношения сторон (ширина / высота) и используют его для корректировки результата на экране.

3

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


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