我在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;
你可以試着描述一下你的情況下'laggy'的含義嗎?我知道它有時難以描述視覺效果,但我很難想象你可以看到什麼。還有什麼時候調用'onIdle()'?它是否定期執行每一幀? – Tim 2012-03-04 19:03:57
按laggy我的意思是,當我移動鼠標有一個明確的'跳',因爲你的觀點改變,而不是一個平穩的過渡。而對於'onIdle'我把它設置爲'glutIdleFunc(onIdle);' – 2012-03-04 19:33:20