-2

这就是我的重塑函数的样子

`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 中设置的位置。当我想在调整大小后将相机留在旋转的地方时,我应该改变什么?

4

3 回答 3

0

您的问题是,glLoadIdentity() + gluLookAt(...)在 yor reshape 函数中使用的完全覆盖了您当前的模型视图矩阵 - 如果您之前使用 应用了任何旋转glRotate,它们将消失,没有办法解决这个问题。

一种可能的快速解决您的问题的方法:不要只glRotate在按下左/右键时调用;相反,将总旋转量存储在某个变量中,并在 resize 函数中调用glRotateafter 。gluLookAt

但是,如果之后您要在代码中添加更多的相机交互,保持相机矩阵正确可能会变得很麻烦;你最终会glRotate / glTranslate / glScale到处都是。相反,我建议您对所有相关值使用变量,例如相机位置、视图矢量等,并通过调用gluLookAt以及gluPerspective在绘制任何内容之前计算每帧一次的相机矩阵 - 以这种方式保持概述要容易得多。

于 2013-05-15T18:03:18.113 回答
0

我敢打赌,您会在显示屏上看到另一个 glu。所以你是。只是在重塑后的下一帧中擦拭它。

无论如何,您最好只保存窗口大小,int w, h;然后在显示或更新函数中使用 glulookat。或者事实上你可以把视口调用留在那里。

当你解决这个问题时,我建议你看看 GLFW 而不是 GLUT。

于 2013-05-15T11:14:17.917 回答
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 是模块范围内的变量。

于 2013-05-15T12:15:05.433 回答