使用`glm :: rotate`和四元数向上旋转3D方向矢量

时间:2020-05-21 10:45:10

标签: c++ matrix quaternions glm-math vectormath

给出以下坐标系 1 ,其中正z朝向上限:

Coordinate system

我有一个名为glm::vec3的{​​{1}},代表3D空间中两个点dirA之间的(规范化)方向 2

Two points in space

两个点BA恰好在同一平面上,因此B的{​​{1}}坐标为零。现在,给定角度z,我想将dir朝天花板旋转指定的量。例如,如果α为45度,我希望dir指向相同的α / dir方向,但指向天花板 { {3}}

3

我最初的想法是计算x的“右”向量,并将其用作旋转轴。我尝试了以下操作:

y

我希望调用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; 计算不正确吗?

我如何达到我想要的结果?

1 个答案:

答案 0 :(得分:0)

您不需要归一化import pandas as pd import matplotlib.pyplot as plt test = pd.DataFrame({'x': range(50), 'y': [i if i != 40 else 10 for i in range(50)]}) plt.figure(**FIGURE) plt.scatter(test['x'], test['y'], marker='x') plt.show() 向量,因为您已将其定义为单位向量,但是您确实需要归一化up向量。

但是,尽管我不熟悉glm,但我怀疑问题是您正在绕轴旋转矩阵(或四元数),而不是创建代表绕轴旋转的矩阵/四元数。快速浏览一下文档,看来您可能想使用:

right