从初始和最终旋转的四元数获取旋转轴

时间:2012-03-31 06:53:43

标签: c# 3d rotation quaternions

我必须找到具有向上和方向矢量的摄像机的轴和旋转角度(它们彼此垂直)。我有旋转的摄像机的UP和方向矢量的初始和最终位置。我想找到相机旋转的轴和角度。我正在为我的项目使用C#。我是这个3D旋转的新手。如果你发现它们很愚蠢,请原谅我的问题。

1 个答案:

答案 0 :(得分:0)

从方向(向前)向量 f 向上向量 u ,您可以通过执行{{3}来获取侧向量 s }( s = fxu )。现在所有三个向量都是正交的。你也应该通过规范它们中的每一个来使它们正交。总之,这些载体形成了标准正交基础。

您现在有两个这样的基础:一个来自您最初的相机方向,另一个来自最终的相机方向。两个基础都可以表示为旋转矩阵。旋转矩阵只是一个3x3矩阵,其中3行分别是:

  1. 前向矢量
  2. 向上矢量
  3. 侧向量
  4. 例如,矩阵:

    [[1 0 0]
     [0 1 0]
     [0 0 1]]
    

    可能是您在启动时的初始摄像机方向,其前向矢量,向上矢量和侧向矢量分别指向正x轴,y轴和z轴。

    您现在可以使用此vector cross product将这两个基础(M1和M2)转换为两个单位四元数(Q1和Q2),这会解决潜在的问题,例如除以零。

    此时,您有两个单位四元数,表示您的初始和最终相机方向。您现在必须找到将Q1转换为Q2的四元数qT,即:

    q2 = qT * q1
    q2 * q1^-1 = qT * (q1 * q1^-1) = qT
    => qT = q2 * q1^-1
    

    知道单位四元数的倒数等于其algorithm

    q1^-1 = q1*    iif  ||q1|| = 1
    qT = q2 * q1^-1 = q2 * q1*
    

    还剩下一步:conjugate qT:

    angle = 2 * acos(qw)
    x = qx / sqrt(1-qw*qw)
    y = qy / sqrt(1-qw*qw)
    z = qz / sqrt(1-qw*qw)
    

    角度当然是以弧度给出的。计算x,y和z时要注意除以零。当没有旋转或非常小的情况时会发生这种情况,所以你应该测试角度是否> epsilon你会选择epsilon是一个很小的角度(比如1/10度),如果是这样的话就不计算向量。