【问题标题】:OpenGL - how to fit a window on resizeOpenGL - 如何在调整大小时调整窗口
【发布时间】:2015-05-23 01:45:39
【问题描述】:

我有一个以窗口屏幕为中心的形状。现在在调整窗口大小时它保持不变(相同的宽度和高度)。 在调整大小时使其适合窗口并保持其纵横比的最佳方法是什么?

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;
}

谢谢

【问题讨论】:

  • 您可以调整前剪裁平面的大小以适应新窗口大小的尺寸。这不会保持纵横比,但不会缩放视图。
  • 我使用 glViewport(0, 0, width, height); 将其调整为窗口大小的尺寸。和 gluOrtho2D(0, 宽度, 高度, 0);我不确定我做对了..
  • 不调整纵横比。如果您想保持恒定的纵横比,则需要计算(初始)宽高比并将width 乘以该比例,而不是在调用gluOrtho2D (...) 时使用height

标签: c++ opengl resize


【解决方案1】:

在顶部:

const int WIDTH = 490;
const int HEIGHT = 600;
const float ASPECT = float(WIDTH)/HEIGHT;   // desired aspect ratio

然后reshapeScene:

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 电话。

此外,gluOrtho2D 本质上是您的相机。由于您没有过多地移动相机或对象,因此您不需要更改它(因此它只使用初始的WIDTHHEIGHT)。

【讨论】:

  • 我做了一个小改动,计算视口的左侧,这将使您的对象在窗口中居中。如果您的相机以原点为中心,这并不简单,但它可以工作。
  • 看起来更好!我看到 glViewport 和 gluOrtho2D 之间存在一种依赖关系。如果我改变其中一个,它会影响另一个。他们是如何依赖的?
  • @no81no 您需要阅读图形管道中的坐标系。 (在此处查看全球图片learnopengl.com/#!Getting-started/Coordinate-Systems
  • 继续:意识到某些坐标 (1, 2, 3) 可以根据上下文表示不同的含义。这和对象有关吗?对着相机?到屏幕(只有 2D 而不是 3D)?你如何从物体过渡到世界,从相机到屏幕?对这些空间的透彻理解对于正确绘制图形非常重要。诚然,2D 比 3D 简单得多,但即使是 2D,知道这些坐标系也可以消除猜测,让一切都正确。
猜你喜欢
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2019-05-15
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
相关资源
最近更新 更多