【发布时间】:2020-12-10 17:53:57
【问题描述】:
从概念上讲,四元数可以在一定程度上存储围绕轴的旋转。 现在,旋转轴在数值上最稳健且计算量最小的方法是什么?
例如,当我有一个四元数,它围绕 y 轴旋转 90 度,我希望将这 90 度应用于其他任意轴,由归一化向量描述。
编辑:由于这也出现了,我添加了一个关于如何正确更改四元数与另一个四元数旋转的轴的答案。
【问题讨论】:
标签: unity3d graphics geometry quaternions
从概念上讲,四元数可以在一定程度上存储围绕轴的旋转。 现在,旋转轴在数值上最稳健且计算量最小的方法是什么?
例如,当我有一个四元数,它围绕 y 轴旋转 90 度,我希望将这 90 度应用于其他任意轴,由归一化向量描述。
编辑:由于这也出现了,我添加了一个关于如何正确更改四元数与另一个四元数旋转的轴的答案。
【问题讨论】:
标签: unity3d graphics geometry quaternions
按照你的描述,你的实际目标是什么有点不清楚。
为了实际保持角度但更改您将使用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 轴应用旋转,然后 someRotation,someRotation 仍然在它自己的轴上。
Quaternion operator *。显然,它不会编辑现有的旋转,而是返回一个新的旋转作为组合两个旋转的结果;)
@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);
这里发生的情况是,我们首先向后旋转到我们想要的轴,然后应用我们想要使用的旋转,然后恢复我们最初应用的旋转。
注意:我很确定,在谈论这个四元数运算时,说“旋转四元数”不是一个有效的术语。
【讨论】: