从概念上讲,四元数可以在一定程度上存储围绕轴的旋转。
例如,当我有一个四元数,它围绕 y 轴旋转 90 度,我希望这些 90 度应用于其他任意轴,由归一化向量描述。
编辑:由于这也出现了,我添加了一个关于如何正确地改变四元数轴与另一个四元数旋转的答案。
做你所描述的事情有点不清楚你的实际目标是什么。
为了实际保持角度但更改轴,您将使用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 °。
@ 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);
这里发生的是,我们首先向后旋转到我们想要的轴,然后应用我们想要使用的旋转,然后恢复我们最初应用的旋转。
注意:我退出肯定,说“旋转四元数”不是一个有效的术语,当谈论这个四元数操作。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(55条)