c++ - 使用 glm 沿四元数平移相机

标签 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 度增量的翻译都同样困惑。我在这里做错了什么,最简单的解决方法是什么?如果它们可能相关,这里是生成我的 View 矩阵的函数和旋转我的相机的函数:

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

最佳答案

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

关于c++ - 使用 glm 沿四元数平移相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326835/

相关文章:

c++ - 在 OSX 的 xcode 中查找 glfw 库文件?

c++ - 未解析的外部符号 __imp__glewInit VS __imp__glewInit@0

c++ - glm::ortho() 实际上是错误的吗?

c++ - OpenGL 模型在一段时间内呈现良好,然后在随机时间后呈现稀疏

c++ - 在游戏编程中,全局变量不好吗?

opengl - 在 OpenGL 中,仅使用 OpenGL3+ 方法创建透视图的最简单方法是什么?

c++ - Oracle sql 读取时删除

c++ - 使用 opengl 用中点定理渲染圆我做错了什么?

c++ - Qt 程序的速度性能 : Windows vs Linux

c++ - 这如何迫使单例?