gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:56:16 24 4
gpt4 key购买 nike

我正在尝试沿 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com