【问题标题】:Translating a camera along a quaternion using glm使用 glm 沿四元数平移相机
【发布时间】:2013-08-20 04:09:58
【问题描述】:

我正在尝试沿 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";
}

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2016-02-24
      • 2013-03-13
      • 2022-01-22
      • 2016-04-21
      • 2016-08-11
      相关资源
      最近更新 更多