【问题标题】:First Person Camera movement issues第一人称相机移动问题
【发布时间】:2014-04-02 21:37:48
【问题描述】:

我正在使用 GLM 库实现第一人称相机,该库为我提供了一些计算透视和“lookAt”矩阵的有用函数。我也在使用 OpenGL,但这对这段代码没有影响。

基本上,我所体验的是我可以环顾四周,就像在常规 FPS 中一样,并且可以四处走动。但是移动被限制在三个轴上,如果我旋转相机,我仍然会沿着相同的方向移动,就像我没有旋转它一样......让我说明一下(在 2D 中,以简化事情)。@ 987654321@

在这张图片中,您可以看到四个摄像头位置。 标有 1 的为运动前,标有 2 的为运动后。 红色三角形表示沿 z 轴直线向前定向的相机。蓝色三角形表示已旋转以沿 x 轴(向左)向后看的相机。 当我按下“向前移动键”时,在这两种情况下,相机都会沿着 z 轴向前移动,而不管相机方向。

我想要的是一种更像 FPS 的行为,向前推动我会朝着相机所面对的方向移动。我认为通过我传递给glm::lookAt 的参数,这将实现。显然不是。

我的计算出了什么问题?

// Calculate the camera's orientation
float angleHori = -mMouseSpeed * Mouse::x; // Note that (0, 0) is the center of the screen
float angleVert = -mMouseSpeed * Mouse::y;

glm::vec3 dir(
    cos(angleVert) * sin(angleHori),
    sin(angleVert),
    cos(angleVert) * cos(angleHori)
);

glm::vec3 right(
    sin(angleHori - M_PI / 2.0f),
    0.0f,
    cos(angleHori - M_PI / 2.0f)
);

glm::vec3 up = glm::cross(right, dir);

// Calculate projection and view matrix
glm::mat4 projMatrix = glm::perspective(mFOV, mViewPortSizeX / (float)mViewPortSizeY, mZNear, mZFar);
glm::mat4 viewMatrix = glm::lookAt(mPosition, mPosition + dir, up);

【问题讨论】:

    标签: c++ opengl camera


    【解决方案1】:

    gluLookAt 采用 3 个参数:眼睛、中心和向上。前两个是位置,最后一个是向量。如果您打算使用此功能,最好始终保持这三个参数。

    来到计算问题。我看到 position 变量在整个代码中都没有改变。所有这些变化都是看点,即仅限centre。正确的做法是先做position += dir,它会沿着dir指向的方向移动相机(位置)。现在要更新centre,第二个参数可以保持原样:position + dir;这将起作用,因为该位置已经更新到新位置,并且从那里我们可以在dir 方向查看更远的点。

    【讨论】:

    • 不会position += dir 自己移动相机,因为dir 总是不同于0? (我刚刚检查过,这确实让它自己移动)。
    • 你自己是什么意思?我认为您需要在相机注视的方向上移动(根据按键向前或向后)。换句话说,它需要按照自己的轴移动,而不是跟随世界的轴。
    • 我想我刚刚明白了,谢谢。一有机会,我会尝试一些东西并报告!
    【解决方案2】:

    问题实际上出在另一种方法上。移动相机时,我需要这样做:

    void Camera::moveX(char s)
    {
        mPosition += s * mSpeed * mRight;
    }
    
    void Camera::moveY(char s)
    {
        mPosition += s * mSpeed * mUp;
    }
    
    void Camera::moveZ(chars)
    {
        mPosition += s * mSpeed * mDirection;
    }
    

    使相机在正确的轴上移动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多