gluLookAt重塑功能

时间:2013-05-15 11:04:27

标签: c++ glut

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

3 个答案:

答案 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来计算每帧一次的摄像机矩阵 - 以这种方式保持概述要容易得多。