我在this tutorial之后设置了一个摄像头。我的问题是,当我移动时,它不是流动的,它有点跳跃。我正在使用此代码移动鼠标时计算MVP:
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 :(得分:0)
查看增加mousespeed
是否有所作为。找到鼠标移动后的距离(存储在dx
和dy
中)后,您需要将距离缩放mousespeed
,然后再将其添加到相机的角度。 mousespeed
的值越低,鼠标移动对相机角度的影响就越小,反之亦然。
您询问的代码也是将摄像机角度限制在0到PI * 2或0到360度之间。