我在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