【问题标题】:How to calculate the difference between 2 rotations in SceneKit / ARKit如何计算 SceneKit / ARKit 中 2 次旋转之间的差异
【发布时间】:2022-04-05 16:55:13
【问题描述】:

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

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

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

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

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

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

任何帮助将不胜感激! 谢谢。

【问题讨论】:

    标签: ios swift scenekit arkit


    【解决方案1】:

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

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

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

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

    let pivotRotationMatrix = lastMazeRotationInTransformMatirx * newRotationInTransformMatrix.transpose
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      相关资源
      最近更新 更多