当x改变符号时,glm orientedAngle给出了截然不同的结果

时间:2013-12-19 13:22:13

标签: c++ rotation glm-math

使用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;
}

1 个答案:

答案 0 :(得分:0)

实际上这听起来是正确的。最简单的方法是在2D和图像中对此进行描绘。

我们假设我有一个向量,比如说(9,1)。我们将忽略Z轴并假设它“离开”屏幕,这给了我们以下内容。我为我糟糕的图画道歉,我没有安装真正的绘图仪!

Image 1

因此,围绕z轴的(9,1)和(1,0)(即x轴)之间的差值约为6度。现在让我们否定x分量上的符号:

Image 2

当然,矢量已移动,但这不是180度的旋转。相反,z轴周围的(-9,1)和(1,0)之间的差值现在为-6度(arctan(-9/1)),或者距离(1,0)为174度。问题是向量(9,-1)和(-9,1)的角度是相同的,所以你将不得不应用一些额外的智能来确定你是否应该从arctan的结果中减去180度。