使用glm沿四元数转换相机

时间:2013-08-20 04:09:58

标签: c++ opengl glm-math

我试图沿着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";
}

1 个答案:

答案 0 :(得分:0)

我猜测“旋转”是相机旋转的反转(将相机视为世界上的物体)。也就是说,“旋转”将物体从世界空间带到相机空间。如果你想向前移动摄像机的世界空间位置,你需要取本地前向矢量(0,0,1)或(0,0,-1)?,乘以“旋转”的倒数(移动)从相机空间到世界空间的矢量),然后缩放并添加到位置。