C++ OpenGL-如何调整窗口大小
我有一个形状是集中在窗口屏幕上。现在,窗口大小保持不变(相同的宽度和高度)。 在调整窗口大小的同时保持其纵横比的最佳方法是什么C++ OpenGL-如何调整窗口大小,c++,opengl,resize,C++,Opengl,Resize,我有一个形状是集中在窗口屏幕上。现在,窗口大小保持不变(相同的宽度和高度)。 在调整窗口大小的同时保持其纵横比的最佳方法是什么 const int WIDTH = 490; const int HEIGHT = 600; /** * render scene */ void renderScene(void) { //clear all data on scene glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
const int WIDTH = 490;
const int HEIGHT = 600;
/**
* render scene
*/
void renderScene(void)
{
//clear all data on scene
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//set white bg color
glClearColor(1, 1, 1, 1);
glColor3ub(153, 153, 255);
glBegin(GL_POLYGON);
glVertex2f(60, 310);
glVertex2f(245, 50);
glVertex2f(430, 310);
glVertex2f(245, 530);
glEnd();
glutSwapBuffers();
}
/**
* reshape scene
*/
void reshapeScene(GLint width, GLint height)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, width, height);
gluOrtho2D(0, width, height, 0);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
/**
* entry point
*/
int main(int argc, char **argv)
{
//set window properties
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(WIDTH, HEIGHT);
glutInitWindowPosition((glutGet(GLUT_SCREEN_WIDTH)-WIDTH)/2, (glutGet(GLUT_SCREEN_HEIGHT)-HEIGHT)/2);
glutCreateWindow("Test Window");
//paste opengl version in console
printf((const char*)glGetString(GL_VERSION));
//register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(reshapeScene);
//start animation
glutMainLoop();
return 0;
}
感谢顶部的:
const int WIDTH = 490;
const int HEIGHT = 600;
const float ASPECT = float(WIDTH)/HEIGHT; // desired aspect ratio
然后重新整形
void reshapeScene(GLint width, GLint height)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
int w = height * ASPECT; // w is width adjusted for aspect ratio
int left = (width - w) / 2;
glViewport(left, 0, w, height); // fix up the viewport to maintain aspect ratio
gluOrtho2D(0, WIDTH, HEIGHT, 0); // only the window is changing, not the camera
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
由于您没有将窗口大小限制为特定的纵横比,因此需要从两个尺寸(此处为高度)中选择一个来驱动视口重塑,并根据该高度和所需的纵横比计算调整后的宽度。请参见上文调整的glViewport
调用
而且,基本上,2d
是您的相机。由于您不需要移动太多摄影机或对象,因此不需要更改(因此它只使用初始的宽度和高度) 在顶部:
const int WIDTH = 490;
const int HEIGHT = 600;
const float ASPECT = float(WIDTH)/HEIGHT; // desired aspect ratio
然后重新整形
void reshapeScene(GLint width, GLint height)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
int w = height * ASPECT; // w is width adjusted for aspect ratio
int left = (width - w) / 2;
glViewport(left, 0, w, height); // fix up the viewport to maintain aspect ratio
gluOrtho2D(0, WIDTH, HEIGHT, 0); // only the window is changing, not the camera
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
由于您没有将窗口大小限制为特定的纵横比,因此需要从两个尺寸(此处为高度)中选择一个来驱动视口重塑,并根据该高度和所需的纵横比计算调整后的宽度。请参见上文调整的glViewport
调用
而且,基本上,2d
是您的相机。由于您不需要移动太多摄影机或对象,因此不需要更改(因此它只使用初始的宽度和高度) 可以调整前剪裁平面的大小以适应新窗口大小的尺寸。这不会保持纵横比,但不会缩放视图;和gluOrtho2D(0,宽度,高度,0);我不确定我是否做对了这不符合纵横比。如果要保持恒定的纵横比,则需要计算宽高比(初始)并将其乘以宽
,而不是在调用gluOrtho2D(…)
时使用高
。可以调整前剪裁平面的大小,以适应新窗口大小的尺寸。这不会保持纵横比,但不会缩放视图;和gluOrtho2D(0,宽度,高度,0);我不确定我是否做对了这不符合纵横比。如果要保持恒定的纵横比,则需要计算宽高比(初始)并将其乘以宽
,而不是在调用gluOrtho2D(…)
时使用高,这将使对象在窗口中居中。如果你的相机居中看原点的话,这并不是那么简单,但它可以工作。它看起来更好!我看到glViewport和gluOrtho2D之间存在某种依赖关系。如果我改变其中一个,它会影响另一个。它们是如何相互依赖的?@no81no您需要阅读图形管道上的坐标系。(请参见此处的全局图:)继续:认识到某些坐标(1、2、3)可以根据上下文表示不同的内容。那和那个物体有关吗?对着镜头?到屏幕(仅为2D而非3D)?如何从对象到世界,从相机到屏幕过渡?对这些空间的透彻理解对于正确绘制图形非常重要。当然,2D要比3D简单得多,但即使使用2D,知道这些坐标系也可以消除一切猜测。我做了一个小改动,计算视口的左侧,这将使对象在窗口中居中。如果你的相机居中看原点的话,这并不是那么简单,但它可以工作。它看起来更好!我看到glViewport和gluOrtho2D之间存在某种依赖关系。如果我改变其中一个,它会影响另一个。它们是如何相互依赖的?@no81no您需要阅读图形管道上的坐标系。(请参见此处的全局图:)继续:认识到某些坐标(1、2、3)可以根据上下文表示不同的内容。那和那个物体有关吗?对着镜头?到屏幕(仅为2D而非3D)?如何从对象到世界,从相机到屏幕过渡?对这些空间的透彻理解对于正确绘制图形非常重要。诚然,2D比3D简单得多,但即使使用2D,了解这些坐标系也可以消除一切正确性的猜测。