Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL的相机是滞后的_C++_Opengl_Glut - Fatal编程技术网

C++ OpenGL的相机是滞后的

C++ OpenGL的相机是滞后的,c++,opengl,glut,C++,Opengl,Glut,我在后面安装了一个摄像头。我的问题是,当我移动时,它不是流体,它有点跳跃。我正在使用以下代码计算鼠标移动时的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

我在后面安装了一个摄像头。我的问题是,当我移动时,它不是流体,它有点跳跃。我正在使用以下代码计算鼠标移动时的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;
    }
}
我的问题是,这是正确的实施方式吗?有没有办法避免这种落后

如果你不介意我问的话,这个代码到底是如何工作的?我知道它限制了你的视线,但我似乎无法理解:

 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;
if(角度x<-M_-PI)
角度x+=M_PI*2;
否则如果(角度x>M_PI)
角度x-=M_PI*2;
如果(角度y<-M_PI/2)
角度y=-M_PI/2;
如果(角度y>M_PI/2)
角度y=M_PI/2;

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


另外,您所问的代码是将您的相机角度限制在0和PI*2之间,或0和360度之间。

您能试着描述一下“laggy”在您的案例中的含义吗?我知道有时很难描述视觉效果,但我很难想象你能看到什么。什么时候调用
onIdle()
?它是不是每一帧都有规律地执行?我的意思是当我移动鼠标时,当你的视点改变时,会有一个清晰的“跳跃”,而不是平滑的过渡。对于
onIdle
我将其设置为
glutIdleFunc(onIdle)嗯,我把它减少了十次方,但它仍然在“跳跃”,只是以较小的角度进行。根据你的评论,看起来你需要与相机相关的角速度。使用鼠标移动的距离设置相机的角速度,以便相机根据更新周期之间经过的时间进行旋转。这里需要的是
鼠标移动
摄像头
功能。
 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;