gpt4 book ai didi

c++ - Glm 四元数观察函数

转载 作者:行者123 更新时间:2023-11-30 00:52:47 29 4
gpt4 key购买 nike

我正在尝试编写一个使用 glm::quat 表示旋转的 lookat 函数,基于此 answer .但是,我在获得正确角度时遇到了麻烦。这是我的观察函数:

void Camera::LookAt(float x, float y, float z) {
glm::vec3 lookVector = glm::vec3(x, y, z);
assert(lookVector != position);

glm::vec3 direction = glm::normalize(lookVector-position);
float dot = glm::dot(glm::vec3(0, 0, -1), direction);
if (fabs(dot - (-1.0f)) < 0.000001f)
rotation = glm::quat(RadiansToDegrees(M_PI), 0.0f, 1.0f, 0.0f);
if (fabs(dot - (1.0f)) < 0.000001f)
rotation = glm::quat();

float angle = RadiansToDegrees(acosf(dot));

glm::vec3 cross = (glm::cross(glm::vec3(0, 0, -1), direction));
rotation = glm::normalize(glm::angleAxis(angle, cross));

std::cout << glm::eulerAngles(rotation).x << " " << glm::eulerAngles(rotation).y << " " << glm::eulerAngles(rotation).z << "\n";
}

当我的相机位于 (0.0f, 0.0f, -10.0f) 时调用 LookAt(0.0f, 0.0f, 0.0f) 时,它会输出正确的旋转 0,0,0。但是,如果我将我的相机平移到 (0.0f, -0.01f, -10.0f) 或更多,我会得到大约 124,0,0 的旋转。如果我继续将 y 平移 -0.01f,这会下降。如果我不规范化四元数,我就不会遇到这个问题。仍然绕 x 轴旋转 124,但外观很好。但是,如果我稍后对四元数进行归一化,它似乎再次旋转到大约 124。我无法对 cross 进行归一化,因为这样做会引发断言。什么会导致我从 lookat 函数中获得关于 x 的 124 欧拉角,我该如何解决它?

最佳答案

从版本 0.9.9.0 开始,<glm/gtc/quaternion.hpp> 中有一个函数主要做你想做的事:

template<typename T, qualifier Q>
tquat<T, Q> quatLookAt(vec<3, T, Q> const& direction, vec<3, T, Q> const& up);

它是由 this pull request 添加的并已于 2017 年 7 月 24 日合并到 master 中。

但是:

  1. 方向必须是归一化 vector !
  2. 方向不能平行于上!

所以你可能想围绕函数编写一个更安全的包装器:

glm::quat safeQuatLookAt(
glm::vec3 const& lookFrom,
glm::vec3 const& lookTo,
glm::vec3 const& up,
glm::vec3 const& alternativeUp)
{
glm::vec3 direction = lookTo - lookFrom;
float directionLength = glm::length(direction);

// Check if the direction is valid; Also deals with NaN
if(!(directionLength > 0.0001))
return glm::quat(1, 0, 0, 0); // Just return identity

// Normalize direction
direction /= directionLength;

// Is the normal up (nearly) parallel to direction?
if(glm::abs(glm::dot(direction, up)) > .9999f) {
// Use alternative up
return glm::quatLookAt(direction, alternativeUp);
}
else {
return glm::quatLookAt(direction, up);
}
}

关于c++ - Glm 四元数观察函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18172388/

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