给定以下坐标系1,其中正数z
朝向天花板:
我有一个表示两点之间和3D 空间2glm::vec3
中的(归一化)方向的调用:dir
A
B
两点A
和B
恰好在同一平面上,所以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
计算不正确吗?
我怎样才能达到我想要的结果?