2012-03-04 58 views
0

我在this tutorial后面设置了一个相机。我的问题是,当我移动它不流畅,它有点跳跃。我计算,只要鼠标移动使用此代码的MVP:OpenGL相机是laggy

void motion(int x, int y) { 
    static bool wrap = false; 

    if(!wrap) { 
     int ww = glutGet(GLUT_WINDOW_WIDTH); 
     int wh = glutGet(GLUT_WINDOW_HEIGHT); 

     int dx = x - ww/2; 
     int dy = y - wh/2; 

     const float mousespeed = 0.001; 

     angles.x += dx * mousespeed; 
     angles.y += dy * mousespeed; 


     if(angles.x < -M_PI) 
      angles.x += M_PI * 2; 
     else if(angles.x > M_PI) 
      angles.x -= M_PI * 2; 

     if(angles.y < -M_PI/2) 
      angles.y = -M_PI/2; 
     if(angles.y > M_PI/2) 
      angles.y = M_PI/2; 

     lookat.x = sinf(angles.x) * cosf(angles.y); 
     lookat.y = sinf(angles.y); 
     lookat.z = cosf(angles.x) * cosf(angles.y); 
     view = glm::lookAt(position, position + lookat, glm::vec3(0, 1, 0)); 

     // move mouse pointer back to the center of the window 
     wrap = true; 
     glutWarpPointer(ww/2, wh/2); 
    } else { 
     wrap = false; 
    } 
} 

然后我更新我的“OnIdele()”功能的属性:

void onIdle() { 
    glUseProgram(program); 

    glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 
    glm::mat4 Model = glm::mat4(1.0f); 
    glm::mat4 MVP = Projection * view * Model; 

    glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, glm::value_ptr(MVP)); 

    glutPostRedisplay(); 
} 

我的问题是,是这是正确的方式来实现这一点?有什么办法可以避免滞后?

另外如果你不介意我问,这个代码究竟是如何工作的?我知道它限制在那里,你可以看看,但我似乎无法理解它:

if(angles.x < -M_PI) 
      angles.x += M_PI * 2; 
     else if(angles.x > M_PI) 
      angles.x -= M_PI * 2; 

     if(angles.y < -M_PI/2) 
      angles.y = -M_PI/2; 
     if(angles.y > M_PI/2) 
      angles.y = M_PI/2; 
+0

你可以试着描述一下你的情况下'laggy'的含义吗?我知道它有时难以描述视觉效果,但我很难想象你可以看到什么。还有什么时候调用'onIdle()'?它是否定期执行每一帧? – Tim 2012-03-04 19:03:57

+0

按laggy我的意思是,当我移动鼠标有一个明确的'跳',因为你的观点改变,而不是一个平稳的过渡。而对于'onIdle'我把它设置为'glutIdleFunc(onIdle);' – 2012-03-04 19:33:20

回答

0

看看是否增加mousespeed有差别。在找到鼠标移动的距离后,将其存储在dxdy中,然后在将距离添加到相机角度之前将距离缩放mousespeedmousespeed的值越低,鼠标移动越不会影响相机的角度,反之亦然。

此外,您询问的代码是将相机角度限制在0和PI * 2之间,或0和360度之间。

+0

嗯我减少了10次幂,但它仍然是'跳跃',它只是以较小的角度进行。 – 2012-03-04 20:08:10

+0

根据你的评论,它看起来像你需要与你的相机相关的角速度。使用鼠标移动的距离设置相机的角速度,以便相机根据更新周期之间的时间间隔旋转。 – PeddleSpam 2012-03-04 20:15:09

+0

这是一个很好的教程,可能对你有用 - [OpenGL相机](http://www.swiftless.com/tutorials/opengl/camera2.html)。 'mouseMovement'和'camera'功能就是你在这里所需要的。 – PeddleSpam 2012-03-04 23:38:34