使用GLM_GTX_vector_angle中的glm :: orientedAngle时出现以下问题。
我只想围绕Y轴旋转。我想要旋转的是一个最初指向正Z轴的物体(例如沿着矢量(0.0, 0.0, 1.0)
)。对象的当前方向由不断变化的向量dir
(标准化)定义。旋转是相对于(0.0, 1.0, 0.0)
完成的。因此,除了dir之外,glm :: rotatingAngle中的所有向量都是常量。这是我发现的:
代码:
glm::orientedAngle(glm::vec3(0.0f, 0.0f, 1.0f), dir, glm::vec3(0.0f, 1.0f, 0.0f))
不同dir
的结果:
dir: (-0.00960893,-0.15582,-0.987739) -> rot: -171.018
dir: (-0.00342022,-0.155258,-0.987868) -> rot: -171.066
dir: (0.00282073,-0.154685,-0.98796) -> rot: 171.1
dir: (0.00874247,-0.154136,-0.988011) -> rot: 171.119
注意dir
中x坐标的符号发生变化时的方向变化。 -171和171远不是相同的角度(-171 + 360 = 189
),因此大约18度左右。是什么导致了这个? dir
向量仅改变0.005左右的增量,并且该大小的其他增量不会对旋转程度产生太大影响。任何帮助表示赞赏。
代表问题的最低可编辑代码:
#include <iostream>
#include <glm/glm.hpp>
#include <glm/gtx/vector_angle.hpp>
int main(void)
{
std::cout << "Results: " << std::endl;
std::cout << glm::orientedAngle(
glm::vec3(0.0f, 0.0f, 1.0f),
glm::normalize(glm::vec3(-0.000209185,0.32454,-0.945872)),
glm::vec3(0.0f, 1.0f, 0.0f)
) << std::endl;
std::cout << glm::orientedAngle(
glm::vec3(0.0f, 0.0f, 1.0f),
glm::normalize(glm::vec3(0.0214591,0.326289,-0.945026)),
glm::vec3(0.0f, 1.0f, 0.0f)
) << std::endl;
return 0;
}
答案 0 :(得分:0)
实际上这听起来是正确的。最简单的方法是在2D和图像中对此进行描绘。
我们假设我有一个向量,比如说(9,1)。我们将忽略Z轴并假设它“离开”屏幕,这给了我们以下内容。我为我糟糕的图画道歉,我没有安装真正的绘图仪!
因此,围绕z轴的(9,1)和(1,0)(即x轴)之间的差值约为6度。现在让我们否定x分量上的符号:
当然,矢量已移动,但这不是180度的旋转。相反,z轴周围的(-9,1)和(1,0)之间的差值现在为-6度(arctan(-9/1)),或者距离(1,0)为174度。问题是向量(9,-1)和(-9,1)的角度是相同的,所以你将不得不应用一些额外的智能来确定你是否应该从arctan的结果中减去180度。