Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ 调整GLUT窗口大小而不调整内容大小?_C++_Opengl_Resize_Glut - Fatal编程技术网

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

C++ 调整GLUT窗口大小而不调整内容大小?,c++,opengl,resize,glut,C++,Opengl,Resize,Glut,我无法实现以下行为。我希望从底部调整窗口的大小,而不使渲染场景扭曲或更改其位置 我使用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)); } 要做到这一点,它将保持窗口的高度/宽度之间的比

我无法实现以下行为。我希望从底部调整窗口的大小,而不使渲染场景扭曲或更改其位置

我使用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));
}
要做到这一点,它将保持窗口的高度/宽度之间的比率始终相同,同时还尝试使用可用窗口的最大大小


编辑:将其始终置于左上角。

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

而不是:

void windowReshapeFunc( GLint newWidth, GLint newHeight ) 
{
  glViewport( 0, 0, newWidth, newHeight );
  .. etc...
}
这样做:

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

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

如果使用正交透视,请使用以下方法:

#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;
}
#包括
int x0,y0=0;
int-ww,hh=0;
void updateCamera()
{
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(x0,x0+ww,y0,y0+hh,-1,1);
glScalef(1,-1,1);
glTranslatef(0,-hh,0);
}
空洞重塑(整数w,整数h)
{
ww=w;
hh=h;
glViewport(0,0,w,h);
updateCamera();
}
作废显示(作废)
{
glClear(GLU颜色缓冲位);
glBegin(GL_三角形);
glColor3f(0.0,0.0,1.0);glVertex2i(0,0);
glColor3f(0.0,1.0,0.0);glVertex2i(200200);
glColor3f(1.0,0.0,0.0);glVertex2i(20200);
格伦德();
glFlush();
再发现();
}
int mx=0;
int my=0;
int dragContent=0;
无效按下(整数按钮、整数状态、整数x、整数y)
{
mx=x;
my=y;
dragContent=button==GLUT\U LEFT\U按钮和状态==GLUT\U DOWN;
}
无效移动(整数x,整数y)
{
如果(拖动内容)
{
x0-=x-mx;
y0+=y-my;
mx=x;
my=y;
updateCamera();
}
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutCreateWindow(“调整窗口大小而不调整内容+拖动内容”);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutMouseFunc(按);
glutMotionFunc(移动);
glutMainLoop();
返回0;
}

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

这是我找到的解决方案,我认为效果很好

我编写了如下重塑方法,该方法在我的主方法中注册为
glutrestraformefunc(重塑)

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

这使我可以将窗口视为场景中的一个窗口,而无需缩放或移动场景。我希望这就是你要找的

不要使用过量。如果没有它,这很简单——只需设置一个最大视口大小,不要增加超过该大小。您需要更新视口和投影矩阵,请检查我的答案。这很接近!如果不是水平调整大小,它也能起作用。你的意思是当你垂直调整大小时,上面的代码不能正确调整大小,但是水平调整可以吗?你确定输入的代码正确吗?我只是仔细检查了一下,它应该能正常工作。您可以在原始问题中发布您的代码,因为到目前为止我在代码中没有发现任何错误。在该代码的末尾肯定至少缺少一个括号,但从理论上看,它看起来很好。你可以把它放在几个语句中(比如,有一个变量newHeight=(w-(h*ratio))>0?h:(w/ratio);并调试变量的设置。我会尝试一下,看看我能做些什么。我可以使用Glut甚至WIN API来防止水平调整大小吗?不确定为什么需要窗口具有固定宽度。但我认为使用WIN API,可以在调整窗口大小时设置窗口宽度。
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