给定以下坐标系1,其中正的
z
指向天花板:
我有一个称为dir
的glm::vec3
,它表示三维空间中两个点A
和B
之间的(归一化)方向2:
两个点A
和B
恰好在同一个平面上,因此dir
的z
坐标为零。现在,给定一个角度α
,我想将dir
向天花板旋转指定的角度。例如,如果α
是45度,则希望dir
在相同的x
/y
方向上,但向上旋转45度3:
我的最初想法是计算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
计算是否不正确?
我应该如何达到我的期望结果?
glm::normalize(input + glm::vec3{0.0, 0.0, tan(aRadians)})
吗?它应该会产生相同的效果。 - NelfealrotationMat
是一个打字错误吗? - G.M.input
已经被标准化了 -right
也应该是标准化的吧? - Vittorio Romeo