2012-03-04 59 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