2015-01-20 1 views
0

Я сделал некоторые формы, как это:Сохранение геометрии нетронутыми на изменение размера экрана

// 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 и выход, как показано: enter image description here

Однако, если я изменить ширину и высоту (не пропорционально) мой виджет, форма искажается (круг выглядит овал, равносторонний треугольник выглядит равнобедренный): enter image description here

Это код обновления виджета:

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 для разных разрешений?

P.S. : Я понимаю, что это не современный OpenGL, а также лучшие способы создания круга.

ответ

3

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

+0

Не могли бы вы немного рассказать об этом? Или будет достаточно ссылки на нечто подобное. –