OpenGL相机太落后了

OpenGL camera is laggy

本文关键字:相机 OpenGL      更新时间:2023-10-16

我按照本教程设置了一台相机。我的问题是,当我移动时,它不是流动的,它有点跳跃。每当鼠标移动时,我都会使用以下代码计算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;

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

此外,您询问的代码将您的相机角度限制在0到PI*2之间,或0到360度之间。