这就是我的reshape func的样子
`void Reshape(int w, int h)
{
const float ar = (float)w/(float)h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(20.0, ar, 1.0, 60.0); // fovy, aspect ratio, zNear, zFar
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(7,7,7,0,-1,0,0,1,0);
}`
当我旋转视图然后调整窗口大小时,相机会回到gluLookAt中设置的位置。当我想在调整大小后让相机停留在旋转的位置时,我应该改变什么?
答案 0 :(得分:0)
我打赌你在显示器上看到了另一个视线。所以你是。只需在重塑后在下一帧中擦除它。
无论如何,你最好只在int w, h;
中保存窗口大小,然后在显示或更新功能中使用glulookat。或者事实上你可以在那里留下视口。
当你修复它时,我建议你看看GLFW而不是GLUT。
答案 1 :(得分:0)
如果我在displayfunc中有glulookat那么我就无法旋转相机。
说谁? 我不愿意透露下面代码片段中使用的“类相机”的代码,但语义应该非常清楚。
void reshape(int w, int h) {
g_width = w; g_height = h;
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
::glutPostRedisplay();
}
void display(void) {
/*
...
*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/*
...
*/
gluPerspective(60.0, g_width/g_height, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.2,0.2,0.2,1.0);
real* polar = &(Camera::get_instance()->polar[0]);
gluLookAt(polar[0]*cos(polar[2])*sin(-polar[1]),
polar[0]*cos(polar[1]),
polar[0]*sin(-polar[2])*sin(-polar[1]),
0,0,0, // look_at
0.0f, 1.0f, 0.0f);
/*
building the scene
[...]
*/
}
g_width和g_height是模块范围内的变量。
答案 2 :(得分:0)
你的问题是yor reshape函数中使用的glLoadIdentity() + gluLookAt(...)
会完全覆盖你当前的模型视图矩阵 - 如果你之前使用glRotate
应用了任何旋转,它们就会消失,没有办法解决这个问题。
可以快速解决您的问题:不要只在按下左/右键时调用glRotate
;相反,将旋转总量存储在某个变量中,并在调整大小函数中glRotate
之后调用gluLookAt
。
但是,如果您要在此之后为代码添加更多相机交互,则保持相机矩阵正确可能会变得很麻烦;你最终会得到glRotate / glTranslate / glScale
。我建议你使用所有相关值的变量,比如摄像机位置,视图矢量等,并在绘制任何东西之前通过调用gluLookAt
以及gluPerspective
来计算每帧一次的摄像机矩阵 - 以这种方式保持概述要容易得多。