Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用“glm::rotate”和四元数向上旋转三维方向向量_C++_Matrix_Quaternions_Glm Math_Vectormath - Fatal编程技术网

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
不会也规范化吗?