调整GLUT窗口大小而不调整内容大小?

时间:2012-10-17 21:54:51

标签: c++ opengl resize glut

我无法实现以下行为。我想从底部调整窗口的大小,而不会使渲染的场景失真或改变其位置。

enter image description here

我正在使用C ++ OpenGL GLUT

void resize(int w, int h)
{
    float ratio = G_WIDTH / G_HEIGHT;
    glViewport(0, 0, (h-(w/ratio))>0? w:(int)(h*ratio), (w-(h*ratio))>0? h:(int)(w/ratio));
}

4 个答案:

答案 0 :(得分:3)

在GLUT调整大小场景功能中,视口默认设置为窗口大小。我会尝试将其更改为您想要的(固定)大小:

而不是:

void windowReshapeFunc( GLint newWidth, GLint newHeight ) 
{
  glViewport( 0, 0, newWidth, newHeight );
  .. etc...
}

这样做:

void windowReshapeFunc( GLint newWidth, GLint newHeight ) 
{
  glViewport( 0, 0, 400, 600 );
  .. etc...
}

或者你想要的任何尺寸。窗口仍将调整大小,但这些场景将始终渲染到(现在已修复)视口。

答案 1 :(得分:2)

如果您使用正交透视,请使用:

#include <GL/glut.h>

int x0, y0 = 0;
int ww, hh = 0;

void updateCamera()
{
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(x0, x0+ww, y0, y0+hh, -1, 1);
  glScalef(1, -1, 1);
  glTranslatef(0, -hh, 0);
}

void reshape(int w, int h)
{
    ww = w;
    hh = h;
    glViewport(0, 0, w, h);  
    updateCamera();
}

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glBegin(GL_TRIANGLES);
    glColor3f(0.0, 0.0, 1.0); glVertex2i(0, 0);
    glColor3f(0.0, 1.0, 0.0); glVertex2i(200, 200);
    glColor3f(1.0, 0.0, 0.0); glVertex2i(20, 200);
  glEnd();
  glFlush();
  glutPostRedisplay(); 
}

int mx = 0;
int my = 0;
int dragContent = 0;

void press(int button, int state, int x, int y)
{
    mx = x;
    my = y;
    dragContent = button == GLUT_LEFT_BUTTON && state == GLUT_DOWN;
}

void move(int x, int y)
{
    if(dragContent)
    {
        x0 -= x - mx;
        y0 += y - my;
        mx = x;
        my = y;
        updateCamera();
    }
}

int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutCreateWindow("Resize window without resizing content + drag content");
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMouseFunc(press);
  glutMotionFunc(move);
  glutMainLoop();
  return 0;
}

您可以使用鼠标左键拖动内容(三角形)。

答案 2 :(得分:1)

ratio = wantedWidth / wantedHeight
glViewport(0, 0, 
      (height-(width/ratio))>0? width:(int)(height*ratio),
  (width-(height*ratio))>0? height:(int)(width/ratio);

会这样做,它保持窗口高度/宽度之间的比例始终相同,同时还尝试使用可用窗口的最大尺寸。

编辑:将它放在左上角。

答案 3 :(得分:1)

以下是我找到的解决方案,我认为该解决方案效果很好。

我按照以下方式编写了我的reshape方法,该方法在我的main方法中注册了glutReshapeFunc(reshape)

void reshape(int width, int height) {
    glViewport(0, 0, width, height);
    aspect = ((double) width) / height;

每当我重绘场景时,我都会使用此调用来设置相机:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, aspect, 1.0, 100.0); // 45 degrees fovY, correct aspect ratio
// then remember to switch back to GL_MODELVIEW and call glLoadIdentity

这让我可以将窗口视为进入场景的窗口,而无需缩放或移动场景。我希望这就是你要找的东西!