C++ 使用“glm::rotate”和四元数向上旋转三维方向向量
给定以下坐标系,其中正C++ 使用“glm::rotate”和四元数向上旋转三维方向向量,c++,matrix,quaternions,glm-math,vectormath,C++,Matrix,Quaternions,Glm Math,Vectormath,给定以下坐标系,其中正z朝向天花板: 我有一个名为dir的glm::vec3表示三维空间中两点a和B之间的(标准化)方向: 两个点A和B恰好位于同一平面上,因此dir的z坐标为零。现在,给定一个角度α,我想朝天花板旋转dir,旋转指定的量。例如,如果α为45度,我希望dir指向相同的x/y方向,但指向天花板45度: 我最初的想法是计算dir的“右”向量,并将其用作旋转轴。我尝试了以下几点: glm::vec3向上旋转因子(常量glm::vec3&input,常量浮点阿拉伯数) { cons
z
朝向天花板:
我有一个名为dir
的glm::vec3
表示三维空间中两点a
和B
之间的(标准化)方向:
两个点A
和B
恰好位于同一平面上,因此dir
的z
坐标为零。现在,给定一个角度α
,我想朝天花板旋转dir
,旋转指定的量。例如,如果α
为45度,我希望dir
指向相同的x
/y
方向,但指向天花板45度:
我最初的想法是计算dir
的“右”向量,并将其用作旋转轴。我尝试了以下几点:
glm::vec3向上旋转因子(常量glm::vec3&input,常量浮点阿拉伯数)
{
const glm::vec3 up{0.0,0.0,1.0};
常量glm::vec3 right=glm::cross(输入,glm::normalize(up));
glm::mat4旋转矩阵(1);//单位矩阵
rotationMatrix=glm::rotate(rotationMatrix,阿拉迪亚语,右图);
返回glm::vec3(旋转矩阵*glm::vec4(输入,1.0));
}
我希望调用旋转因子向上(dir,glm::radians(45))将返回一个表示我所需的新方向的向量,但它总是返回一个带有零z
分量的向量
我还尝试用四元数表示相同的旋转:
glm::quat q;
q = glm::rotate(q, aRadians, right);
return q * input;
但是,结果向量似乎总是有一个零z
分量
我做错了什么
- 我是否误解了“旋转轴”的含义李>
- 我的
计算是否不正确正确
如何实现我想要的结果?你不需要规范化你的
向上
向量,因为你将它定义为一个单位向量,但是你需要规范化你的右
向量
但是,虽然我不熟悉glm,但我怀疑问题在于您正在围绕轴旋转矩阵(或四元数),而不是创建表示围绕轴旋转的矩阵/四元数。快速查看文档,您可能希望使用:
glm::mat4 rotationMatrix = glm::rotate(radians, right);
你能试试
glm::normalize(input+glm::vec3{0.0,0.0,tan(阿拉伯语)})
?它也应该这样做。rotationMat
a打字错误?@G.M.:是的,修复了。很抱歉在构建旋转矩阵之前规范化右向量?@noobius,input
已经规范化了-难道right
不会也规范化吗?