gpt4 book ai didi

c++ - 使用 `glm::rotate` 和四元数向上旋转 3D 方向 vector

转载 作者:行者123 更新时间:2023-12-03 06:55:19 50 4
gpt4 key购买 nike

给定以下坐标系 1 ,其中正 z走向天花板:

Coordinate system

我有一个 glm::vec3称为 dir表示两点之间的(归一化)方向 AB在 3D 空间 2 :

Two points in space

两点AB碰巧在同一架飞机上,所以z坐标dir为零。现在,给定一个角度 α , 我想旋转 dir向上限指定的金额。例如,如果 α是45度,我想要dir指向相同的 x/y方向,但朝向天花板 45 度 3 :

Direction after rotation

我最初的想法是计算 dir 的“正确” vector , 并将其用作旋转轴。我尝试了以下操作:

glm::vec3 rotateVectorUpwards(const glm::vec3& input, const float aRadians)
{
const glm::vec3 up{0.0, 0.0, 1.0};
const glm::vec3 right = glm::cross(input, glm::normalize(up));

glm::mat4 rotationMatrix(1); // Identity matrix
rotationMatrix = glm::rotate(rotationMatrix, aRadians, right);
return glm::vec3(rotationMatrix * glm::vec4(input, 1.0));
}

我希望调用 rotateVectorUpwards(dir, glm::radians(45))会返回一个代表我想要的新方向的 vector ,但它总是返回一个零 z 的 vector 组件。

我还尝试用四元数表示相同的旋转:

glm::quat q;
q = glm::rotate(q, aRadians, right);
return q * input;

但是,结果 vector 似乎总是有一个零 z组件。

我做错了什么?

  • 我是否误解了“旋转轴”的含义?
  • 是我的 right计算不正确?

我怎样才能达到我想要的结果?

最佳答案

您不需要规范化您的 up vector ,因为您将它定义为一个单位 vector ,但您确实需要规范化您的 right vector 。

但是,虽然我不熟悉 glm,但我怀疑问题是您正在绕轴旋转矩阵(或四元数),而不是创建表示绕轴旋转的矩阵/四元数。快速浏览一下文档,您可能想要使用:

glm::mat4 rotationMatrix = glm::rotate(radians, right);

关于c++ - 使用 `glm::rotate` 和四元数向上旋转 3D 方向 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61932714/

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