第一人称相机运动问题

时间:2014-04-02 21:37:49

标签: c++ opengl camera

我正在使用GLM库实现第一人称相机,它为我提供了一些有用的功能,可以计算透视效果,并且可以看到它们。矩阵。我也使用OpenGL,但这不会对此代码产生影响。

基本上,我所经历的是我可以环顾四周,就像常规的FPS一样,并四处走动。但是运动被限制在三个轴上,如果我旋转相机,我仍然会朝着相同的方向移动,就像我没有旋转它一样......让我来说明(在2D中,为了简化事情)。{ {0}}

在此图像中,您可以看到四个摄像头位置。 那些标有一个的是在运动之前,标有一个的是在运动之后。 红色三角形表示沿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);

2 个答案:

答案 0 :(得分:1)

gluLookAt需要3个参数:眼睛,中心和向上。前两个是位置,而最后一个是向量。如果您正计划使用此功能,那么您只能始终如一地维护这三个参数。

计算问题。我看到position变量在整个代码中没有变化。所有这些变化都是看点I.e.仅centre。正确的做法是首先执行position += dir,这将沿着dir指向的方向移动摄像机(位置)。现在要更新centre,第二个参数可以原样保留:position + dir;这将有效,因为该职位已经更新到新职位,从那里我们可以在dir方向更远的地方看一下。

答案 1 :(得分:0)

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

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;
}

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