旋转四元数/改变它旋转的轴
Rotate a quaternion / Change the axis it rotates around
从概念上讲,四元数可以存储一定程度的绕轴旋转。
现在,旋转轴的数值最稳健且计算强度最低的方法是什么?
例如,当我有一个围绕 y 轴旋转 90 度的四元数时,我希望将这 90 度应用到其他某个任意轴,用归一化向量描述。
编辑:因为这也出现了,所以我添加了一个关于如何正确更改四元数与另一个四元数一起旋转的轴的答案。
按照您的描述,您的实际目标是什么有点不清楚。
为了实际保持角度但改变轴你会使用Quaternion.ToAngleAxis
, alter the axis and then pass it back into 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°。
@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);
这里发生的是我们首先向后旋转到我们想要的轴,然后应用我们想要使用的旋转,然后恢复我们最初应用的旋转。
注意:我敢肯定,在谈论这个四元数操作时,说“旋转四元数”不是一个有效的术语。
从概念上讲,四元数可以存储一定程度的绕轴旋转。 现在,旋转轴的数值最稳健且计算强度最低的方法是什么?
例如,当我有一个围绕 y 轴旋转 90 度的四元数时,我希望将这 90 度应用到其他某个任意轴,用归一化向量描述。
编辑:因为这也出现了,所以我添加了一个关于如何正确更改四元数与另一个四元数一起旋转的轴的答案。
按照您的描述,您的实际目标是什么有点不清楚。
为了实际保持角度但改变轴你会使用Quaternion.ToAngleAxis
, alter the axis and then pass it back into 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°。
@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);
这里发生的是我们首先向后旋转到我们想要的轴,然后应用我们想要使用的旋转,然后恢复我们最初应用的旋转。
注意:我敢肯定,在谈论这个四元数操作时,说“旋转四元数”不是一个有效的术语。