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

C# 从初始和最终旋转的四元数获取旋转轴,c#,3d,rotation,quaternions,C#,3d,Rotation,Quaternions,我必须找到一个具有向上和方向向量的相机的轴和旋转角度(它们都相互垂直)。我有旋转相机的向上和方向向量的初始和最终位置。我想找到相机的旋转轴和角度。我正在使用C#进行我的项目。我不熟悉这种3D旋转。如果你觉得我的问题很傻,请原谅 从方向(正向)向量f和上方向向量u,可以通过执行a(s=f x u)得到边向量s。这三个向量现在都是正交的。还应该通过规范化它们中的每一个使它们正交。总之,这些向量构成了正交基 您现在有两个这样的基础:一个来自初始摄影机方向,另一个来自最终摄影机方向。这两个基都可以表示为

我必须找到一个具有向上和方向向量的相机的轴和旋转角度(它们都相互垂直)。我有旋转相机的向上和方向向量的初始和最终位置。我想找到相机的旋转轴和角度。我正在使用C#进行我的项目。我不熟悉这种3D旋转。如果你觉得我的问题很傻,请原谅

从方向(正向)向量f和上方向向量u,可以通过执行a(s=f x u)得到边向量s。这三个向量现在都是正交的。还应该通过规范化它们中的每一个使它们正交。总之,这些向量构成了正交基

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

  • 前向向量
  • 上方向向量
  • 边向量
  • 例如,矩阵:

    [[1 0 0]
     [0 1 0]
     [0 0 1]]
    
    可以是启动时的初始相机方向,其正向向量、向上向量和侧向量分别指向正x轴、y轴和z轴

    现在,您可以将这两个基(M1和M2)转换为两个单位四元数(Q1和Q2),使用此函数可以解决诸如除以零之类的潜在问题

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

    q2 = qT * q1
    q2 * q1^-1 = qT * (q1 * q1^-1) = qT
    => qT = q2 * q1^-1
    
    知道单位四元数的倒数等于其:

    只剩下一步:qT:


    当然,角度是以弧度表示的。在计算x、y和z时要小心被零除。这种情况会发生在没有旋转或旋转很小的情况下,因此您应该测试“如果角度>ε”,您可以选择ε非常小的角度(比如说1/10度),如果是这种情况,则不计算矢量。

    非常感谢您的回答。这对我帮助很大。我对将矩阵转换为四元数的算法有一个小问题。我的软件摄像机生成一些向上和方向向量,这些向量给出的矩阵轨迹小于1。当旋转矩阵的轨迹小于1时,旋转轴和角度计算会给出奇怪的值。您知道如何解决此问题吗?请参阅第238行的函数:如果解决了您的问题,请检查此答案。
    q1^-1 = q1*    iif  ||q1|| = 1
    qT = q2 * q1^-1 = q2 * q1*
    
    angle = 2 * acos(qw)
    x = qx / sqrt(1-qw*qw)
    y = qy / sqrt(1-qw*qw)
    z = qz / sqrt(1-qw*qw)