Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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_Glm - Fatal编程技术网

C++ 在OpenGL中实现可平移的相机

C++ 在OpenGL中实现可平移的相机,c++,opengl,glm,C++,Opengl,Glm,我想知道你将如何实现一个可以在OpenGL中平移的相机。这是我当前的代码和基本想法: mouseSlope.first = mousePressedPos.first - xpos; mouseSlope.second = mousePressedPos.second - ypos; float d, z; d = (glm::dot(cameraFront, (-cameraRight))); if (came

我想知道你将如何实现一个可以在OpenGL中平移的相机。这是我当前的代码和基本想法:

        mouseSlope.first = mousePressedPos.first - xpos;
        mouseSlope.second = mousePressedPos.second - ypos;

        float d, z;
        d = (glm::dot(cameraFront, (-cameraRight)));

        if (cameraFront.y != 0.0f) {
            z = (d + (mouseSlope.first * cameraFront.x + mouseSlope.second * cameraFront.y)) / -cameraFront.y;
        }
        else{
            z = (d + (mouseSlope.first * cameraFront.x + mouseSlope.second * cameraFront.y));
        }
        glm::vec3 translation(mouseSlope.first, mouseSlope.second, z);
        cameraPos -= 0.05f * glm::normalize(translation);

      glm::vec3 direction;
      direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
      direction.y = sin(pitch);
      direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
      cameraFront = glm::normalize(direction);

    cameraRight = glm::cross(cameraFront, worldUp);
    cameraUp = glm::cross(cameraFront, cameraRight);
在这段代码中,每当按下平移按钮时,我都会选择鼠标位置,并用当前鼠标位置减去鼠标位置。这将为我提供当前鼠标位置和按下平移按钮时鼠标位置之间的x和y坐标。从那里,我找到了平面方程,在右向量的方向上与相机相交,使用相机的右向量和正交前向量。然后,使用之前计算的x和y坐标,我可以计算新平移必须到达的z位置,并从那里构造和实现它。问题是,glm平移向量在某一点会变成-nan(ind)。我是朝着正确的方向走,还是有一种更有效、更优化的方法

旁注: 我最终打电话给:

glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);

在我的代码中的其他地方。

这是旋转相机的常用方法,但大多数应用程序都使用表示旋转的四元数。四元数``取一个带有欧拉角的向量并表示它<代码>四元数也不能有万向节锁,但您的代码包括平移。平移意味着什么?平移意味着在使用平面方程计算出所有x、y、z值后,将相机移动到所需位置。