是否可以仅使用四元数在3D空间中旋转矢量?

时间:2015-06-19 02:29:49

标签: c++ rotation

我想在原点周围的3D空间中旋转矢量。

假设我有一个以原点为中心的假想多边形,并垂直于y轴。

然后,我希望将此多边形围绕某个任意轴旋转一些任意旋转量。

示例:绕Y轴旋转90度。视图沿-Y轴。

Rotate by 90 degrees

执行此操作的一种方法是创建旋转矩阵并将旋转应用于多边形的每个点。我现在可以这样做了。

但是,我决定使用四元数来实现这一目标。

尝试:绕Y轴旋转90度。视图沿-Y轴。

Failure

似乎代码有问题。

为了尝试找出问题,我创建了一个函数qRotate,它应该围绕原点旋转一个点(或矢量)。为了检查我的数学是否正确,我使用两种不同的方法得出最终轮换。但是,这两种方法都会产生相同的错误结果。

void qRotate(glm::vec3 point, glm::vec3 rotate)
{
  printf("\n\n%f %f %f around point %f %f %f", 
          rotate.x, rotate.y, rotate.z, point.x, point.y, point.z);

  //Create quaternion.
  glm::quat orientation = glm::quat(rotate);

  //Normalize
  orientation = glm::normalize(orientation);

  /*Method 1 - pure vector quaternion.*/
  //Create the 'pure' vector quaternion
  glm::quat pure = glm::quat(0.0, point.x, point.y, point.z);
  glm::quat qpq = orientation * pure * (glm::conjugate(orientation));
  //Form the result
  glm::vec3 result = glm::vec3(qpq.x, qpq.y, qpq.z);
  printf("\nResult1 = %f %f %f", result.x, result.y, result.z);

  /*Method 2 - just apply the orientation to the point.*/
  glm::vec3 alpha = orientation * point;
  printf("\nResult2 = %f %f %f", alpha.x, alpha.y, alpha.z);
}

一些样本输入和输出:

qRotate(glm::vec3(10.0, 0.0, 0.0), glm::vec3(0.0, 45.0, 0.0));

0.000000 45.000000 0.000000 around point 10.000000 0.000000 0.000000
Result1 = 5.253221 0.000000 -8.509035
Result2 = 5.253221 0.000000 -8.509035

(预期结果 - 接近7.5,0.0,7.5)

qRotate(glm::vec3(10.0, 0.0, 0.0), glm::vec3(0.0, 90.0, 0.0));

0.000000 90.000000 0.000000 around point 10.000000 0.000000 0.000000
Result1 = -4.480736 0.000000 -8.939966
Result2 = -4.480736 0.000000 -8.939966

(预期结果 - 0.00000,0.00000,10.00000)

qRotate(glm::vec3(10.0, 0.0, 0.0), glm::vec3(0.0, 180.0, 0.0));
Result1 = -5.984600 0.000000 8.011526
Result2 = -5.984600 0.000000 8.011526

(预期结果 - -10.00000,0.00000,0.0000)

我的理解是数学检查出来,因此,我试图使用它的方式肯定有问题。我已经看到许多资源采用旋转四元数(方向)并将其转换为4x4矩阵,然后将旋转应用于矢量,并将矩阵转换回(旋转)3d矢量。

在我的代码的其他部分,我目前正在执行四元数矩阵向量转换,但我认为它似乎效率低下。

我已经读过可以单独使用四元数来推导旋转点,并使用了我的代码中建议的那些算法。我还认为结果可能不一定是垃圾,实际上代表了一些有用的东西,但我不知道是什么。

单独使用四元数是不可能的吗?

1 个答案:

答案 0 :(得分:2)

您的函数以弧度为单位旋转,但您输入的角度为度。您应该以弧度为单位输入角度,或者在函数顶部将度数转换为弧度。