2

我正在尝试沿 glm::quat 中定义的方向转换相机的位置。

void Camera::TranslateCameraAlongZ(float distance) {
    glm::vec3 direction = glm::normalize(rotation * glm::vec3(0.0f, 0.0f, 1.0f));
    position += direction * distance;
}

当旋转是身份四元数时,这很好用。当旋转是其他东西时,X 和 Z 平移不起作用。当相机向左旋转 45 度并且我打电话TranslateCameraAlongZ(-0.1f)时,当我应该向后和向右移动时,我被向后和向左平移。所有不是完美 90 度增量的翻译都同样混乱。我在这里做错了什么,最简单的解决方法是什么?如果它们可能相关,这里是生成我的视图矩阵的函数和旋转我的相机的函数:

glm::mat4 Camera::GetView() {
    view = glm::toMat4(rotation) * glm::translate(glm::mat4(), position);
    return view;
}

void Camera::RotateCameraDeg(float x, float y, float z) {
    rotation = glm::normalize(glm::angleAxis(x,glm::vec3(1.0f, 0.0f, 0.0f)) * rotation);
    rotation = glm::normalize(glm::angleAxis(y,glm::vec3(0.0f, 1.0f, 0.0f)) * rotation);
    rotation = glm::normalize(glm::angleAxis(z,glm::vec3(0.0f, 0.0f, 1.0f)) * rotation);
    std::cout << glm::eulerAngles(rotation).x  << " " << glm::eulerAngles(rotation).y << " " << glm::eulerAngles(rotation).z << "\n";
}
4

1 回答 1

0

我猜“旋转”是相机旋转的倒数(把相机想象成世界上的一个物体)。也就是说,“旋转”将对象从世界空间带到相机空间。如果要向前移动相机的世界空间位置,需要取局部前向向量 (0,0,1) 或 (0,0,-1)?,乘以“旋转”的倒数(移动从相机空间到世界空间的向量),然后缩放并添加到位置。

于 2013-08-20T06:03:40.013 回答