在屏幕尺寸变化时保持几何体完整
Keeping the geometry intact on screen size change
我做了一些像这样的形状:
// 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();
最初我将我的 window 尺寸保持为 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);
}
我知道我可以让视口本身保持相同的宽度和高度,但是很多 space 会被浪费掉。
问。有什么解决办法吗?
问。游戏开发者通常如何处理这个问题,为不同的分辨率设计 OpenGL 游戏?
P.S。 : 我知道这不是现代的 OpenGL,而且还有更好的方法来制作圆圈。
他们通过使用投影矩阵来解决这个问题,透视矩阵和正射投影传统上都有一种获取纵横比 (width/height) 的方法,并使用它来调整屏幕上的结果。
我做了一些像这样的形状:
// 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();
最初我将我的 window 尺寸保持为 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);
}
我知道我可以让视口本身保持相同的宽度和高度,但是很多 space 会被浪费掉。
问。有什么解决办法吗?
问。游戏开发者通常如何处理这个问题,为不同的分辨率设计 OpenGL 游戏?
P.S。 : 我知道这不是现代的 OpenGL,而且还有更好的方法来制作圆圈。
他们通过使用投影矩阵来解决这个问题,透视矩阵和正射投影传统上都有一种获取纵横比 (width/height) 的方法,并使用它来调整屏幕上的结果。