Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL-如何调整窗口大小_C++_Opengl_Resize - Fatal编程技术网

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,了解这些坐标系也可以消除一切正确性的猜测。