3

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

坐标系

我有一个表示两点之间和3D 空间2glm::vec3中的(归一化)方向的调用:dirAB

空间中的两个点

两点AB恰好在同一平面上,所以z坐标dir为零。现在,给定一个角度α,我想dir向天花板旋转指定的量。例如,如果α是 45 度,我想dir指向相同x/y方向,但指向天花板3 45 度:

旋转后方向

我最初的想法是计算 的“右”向量dir,并将其用作旋转轴。我尝试了以下方法:

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))会返回一个代表我想要的新方向的向量,但它总是返回一个z分量为零的向量。

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

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

但是,再一次,得到的向量似乎总是有一个零z分量。

我究竟做错了什么?

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

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

4

1 回答 1

0

您不需要对up向量进行归一化,因为您将其定义为单位向量,但您确实需要对right向量进行归一化。

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

glm::mat4 rotationMatrix = glm::rotate(radians, right);
于 2020-09-26T09:06:16.383 回答