如何计算 SceneKit / ARKit 中 2 个旋转之间的差异

How to calculate the difference between 2 rotations in SceneKit / ARKit

我在 ARKit 中有一个节点,我已经在某个时候注册了它的旋转。 稍后,我再次注册节点的当前旋转,我需要知道这两者之间的区别。

我需要 simdRotation 格式,因为我需要将它注入 simdPivot,然后相应地打开我的节点。所以我需要旋转轴的角度和矢量。 (所以我会把这个 simdRotation 变成一个旋转矩阵,连同平移,将它提供给 simdPivot - 我知道该怎么做)。

我一直在尝试很多不同的事情,但我找不到如何计算这种差异,也找不到任何文档或网站来解释如何实现这一点。

我尝试过使用 simdEulerAnglessimdOrientation。 我找到了一种将 eulerAngles 转换为方向四元数的方法。但是从这里我不知道如何将它转换回旋转格式。

我需要在我的代码中的 2 个地方执行此操作。在一个地方我需要在所有 3 个方向上的旋转差异,在第二个地方我只需要围绕 y 轴的旋转差异。

那么找到 2 个旋转之间的差异的正确方法是什么? 我觉得它一定比我现在看起来的要简单得多。 也许我可以将两者都转换为旋转矩阵,从这里有一个清晰的公式?

如有任何帮助,我们将不胜感激! 谢谢

所以我最终弄明白了。 我将每个旋转变成一个旋转矩阵 - 在我的例子中我使用 simd_float4x4 因为我后来将它与平移(作为第 4 列)组合成一个变换矩阵。 我这样做:

let newRotationInTransformMatrix = simd_float4x4(SCNMatrix4MakeRotation(currentRotation!.w, currentRotation!.x, currentRotation!.y, currentRotation!.z))

(如果有人知道怎么直接在simd世界中创建这样的矩阵,请评论。我不知道所以我先用SCN表示法创建它然后转换为sims格式)。

我对另一个旋转做同样的事情。 然后为了找出两者之间的区别,我将一个矩阵乘以另一个矩阵的转置:

let pivotRotationMatrix = lastMazeRotationInTransformMatirx * newRotationInTransformMatrix.transpose

这对我有用。希望对其他人也有帮助!