C++ OpenGL在调整窗口大小时保持对象形状
我有一个正方形,我试图在调整窗口大小时使其保持正方形,而不是随着窗口拉伸。我有一些代码,我认为这将工作,但当我调整窗口的正方形收缩和消失。当我将窗口恢复到原来的大小时,它不会返回。有人能告诉我我做错了什么,以及如何修复它吗C++ OpenGL在调整窗口大小时保持对象形状,c++,opengl,orthographic,C++,Opengl,Orthographic,我有一个正方形,我试图在调整窗口大小时使其保持正方形,而不是随着窗口拉伸。我有一些代码,我认为这将工作,但当我调整窗口的正方形收缩和消失。当我将窗口恢复到原来的大小时,它不会返回。有人能告诉我我做错了什么,以及如何修复它吗 void display(void) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-0.5, -0.5); glVertex2f(-0.5, 0.5);
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
return;
}
void reshape(int w, int h) {
const float aspectRatio = ((float)w) / h;
float xSpan = 1;
float ySpan = 1;
if (aspectRatio > 1) {
xSpan *= aspectRatio;
}
else {
ySpan *= aspectRatio;
}
gluOrtho2D(-1*xSpan, xSpan, -1*ySpan, ySpan);
glViewport(0, 0, w, h);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("simple");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
}
函数并将当前矩阵乘以新的正交投影矩阵。这导致如果第二次调用
重塑
,则之前由gluOrtho2D
设置的矩阵将与新矩阵相乘,并获得连续更改
您必须通过“重置”矩阵堆栈上的矩阵(初始化同一矩阵)。此外,应通过以下方式选择投影矩阵堆栈:
视口的设置是正确的,你也可以正确地考虑纵横比(在<代码> GrutoX2D)。但是,如果纵横比小于1.0,则存在一个问题。它应该是
ySpan/=aspectRatio代码>
我建议在显示
功能中设置视口和投影矩阵,并在重塑
功能中设置通知标志。请注意,应尽可能少地更改视口和投影矩阵
bool vp_valid = true;
int width, height;
void reshape(int w, int h) {
vp_valid = false;
width = w;
height = h;
}
void display(void)
{
if (!vp_valid)
{
const float aspectRatio = (float)width / height;
float sx = aspectRatio > 1.0f ? aspectRatio : 1.0f;
float sy = aspectRatio > 1.0f ? 1.0f : 1.0f/aspectRatio;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-sx, sx, -sy, sy);
glViewport(0, 0, width, height);
}
.....
}
为什么在重塑函数中调用2d
?它应该包含将投影矩阵重置为恒等式的代码。。。改为在显示函数中调用2d
。
bool vp_valid = true;
int width, height;
void reshape(int w, int h) {
vp_valid = false;
width = w;
height = h;
}
void display(void)
{
if (!vp_valid)
{
const float aspectRatio = (float)width / height;
float sx = aspectRatio > 1.0f ? aspectRatio : 1.0f;
float sy = aspectRatio > 1.0f ? 1.0f : 1.0f/aspectRatio;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-sx, sx, -sy, sy);
glViewport(0, 0, width, height);
}
.....
}