【问题标题】:Getting rotation axis from initial and final rotated quaternions从初始和最终旋转四元数中获取旋转轴
【发布时间】:2012-03-31 06:53:42
【问题描述】:

我必须使用 UP 和 Direction 矢量(它们都相互垂直)找到相机的轴和旋转角度。我有旋转的相机的 UP 和方向矢量的初始和最终位置。我想找到相机的旋转轴和角度。我在我的项目中使用 C#。我是这个 3D 旋转的新手。所以如果你觉得我的问题很傻,请原谅我的问题。

【问题讨论】:

    标签: c# 3d rotation quaternions


    【解决方案1】:

    从方向(前向)向量f和向上向量u,您可以通过执行vector cross product( s = f x u)。现在所有三个向量都是正交的。您还应该通过对它们中的每一个进行归一化来使它们正交化。总之,这些向量构成一个正交基。

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

    1. 前向向量
    2. 向上向量
    3. 边向量

    例如矩阵:

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

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

    您现在可以使用此algorithm 将这两个基(M1 和 M2)转换为两个单位四元数(Q1 和 Q2),该algorithm 可以处理除以零等潜在问题。

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

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

    知道单位四元数的倒数等于它的conjugate:

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

    还剩一步:extracting the axis and angle from quaternionqT:

    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 度),如果是,则不计算向量是这样的。

    【讨论】:

    • 非常感谢您的回复。这真的帮助了我很多。我对将矩阵转换为四元数的算法有一个小问题。我的软件相机生成一些向上和方向向量,这些向量给出的矩阵轨迹小于一个。当旋转矩阵的轨迹小于 1 时,旋转轴和角度计算会给出奇怪的值。你知道如何解决这个问题吗?
    • 查看第 238 行的函数:java.net/projects/vecmath/sources/svn/content/trunk/src/javax/… 如果它解决了您的问题,请酌情检查此答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多