【问题标题】:Rotate a quaternion / Change the axis it rotates around旋转一个四元数/改变它旋转的轴
【发布时间】:2020-12-10 17:53:57
【问题描述】:

从概念上讲,四元数可以在一定程度上存储围绕轴的旋转。 现在,旋转轴在数值上最稳健且计算量最小的方法是什么?

例如,当我有一个四元数,它围绕 y 轴旋转 90 度,我希望将这 90 度应用于其他任意轴,由归一化向量描述。

编辑:由于这也出现了,我添加了一个关于如何正确更改四元数与另一个四元数旋转的轴的答案。

【问题讨论】:

    标签: unity3d graphics geometry quaternions


    【解决方案1】:

    按照你的描述,你的实际目标是什么有点不清楚。

    为了实际保持角度但更改您将使用Quaternion.ToAngleAxis 的轴,更改轴然后将其传回Quaternion.AngleAxis

    比如

    Quaternion someRotation;
    
    someRotation.ToAngleAxis(out var angle, out var axis);
    
    var newAxis = Vector3.up;
    var newRotation = Quaternion.AngleAxis(angle, new axis);
    

    或者您使用* 将现有的Quaternion 旋转为另一个人

    Quaternion newRotation = someRotation * Quaternion.Euler(90, 0, 0);
    

    这将采用现有的旋转并将其绕 X 轴旋转 90°。

    【讨论】:

    • 感谢您的回答,我不知道ToAngleAxis。第一个解决方案解决了我描述的问题。但是第二个是不正确的,因为它不会“旋转”第一个四元数轴,而是先围绕 x 轴应用旋转,然后 someRotationsomeRotation 仍然在它自己的轴上。
    • 第二部分正如我所说的那样:它旋转现有的旋转。就像在已经存在的轮换中添加额外的轮换一样;)见Quaternion operator *。显然,它不会编辑现有的旋转,而是返回一个新的旋转作为组合两个旋转的结果;)
    • 我只是想指出第一个和第二个解决方案不会产生相同的结果。但这次谈话似乎缺乏可靠的术语来描述我们想说的事情。因为对我来说,“旋转四元数”意味着改变它的旋转轴,而不是在顶部添加另一个,但由于我有点编造了这个术语,所以进一步讨论这个可能没有意义。
    【解决方案2】:

    @derHugo 的解决方案解决了我最初提出的问题,但他回答的第二部分并没有按照他的描述进行。要使用另一个四元数旋转四元数的旋转轴,您需要以不同的方式应用旋转。

    例如你有一个四元数 yQuaternion,它围绕 y 轴旋转 90° 并且想要旋转,它的旋转轴围绕 x 轴旋转 90°(这将导致四元数围绕 z 轴旋转 90°)你会必须执行以下操作。

    // The quaternion, we want to "rotate"
    var yQuaternion = Quaternion.Euler(0f, 90f, 0f);
    // The quaternion we want to rotate by.
    var xQuaternion = Quaternion.Euler(90f, 0f, 0f);
    
    var result = xQuaternion * yRotation * Quaternion.Inverse(xQuaternion);
    

    这里发生的情况是,我们首先向后旋转到我们想要的轴,然后应用我们想要使用的旋转,然后恢复我们最初应用的旋转。

    注意:我很确定,在谈论这个四元数运算时,说“旋转四元数”不是一个有效的术语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2018-03-28
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多