OpenGL相机很迟钝

时间:2012-03-04 18:14:23

标签: c++ opengl glut

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

1 个答案:

答案 0 :(得分:0)

查看增加mousespeed是否有所作为。找到鼠标移动后的距离(存储在dxdy中)后,您需要将距离缩放mousespeed,然后再将其添加到相机的角度。 mousespeed的值越低,鼠标移动对相机角度的影响就越小,反之亦然。

您询问的代码也是将摄像机角度限制在0到PI * 2或0到360度之间。