【问题标题】:SceneKit - Rotate object around X and Z axisSceneKit - 围绕 X 和 Z 轴旋转对象
【发布时间】:2018-02-06 08:17:01
【问题描述】:

我将 ARKit 与 SceneKit 一起使用。当用户按下按钮时,我创建了一个锚点,并为与它对应的 SCNNode 添加了一个 3D 对象(从项目中的 .scn 文件加载)。

3D 对象面向相机放置,与相机的方向相同。我想让它看起来像物体躺在一个平面上,如果是这样的话,它不会倾斜。所以,如果我做对了,我需要应用一个旋转变换,使它围绕 X 和 Z 轴的旋转变为 0。

我的尝试是:取节点的 x 和 z eulerAngles,反转它们,然后围绕每个轴旋转该量

let rotationZ = rotationMatrixAroundZ(radians: -node.eulerAngles.z)
let rotationX = rotationMatrixAroundX(radians: -node.eulerAngles.x) 

let rotationTransform = simd_mul(rotationTransformX, rotationTransformZ)
node.transform = SCNMatrix4(simd_mul(simd_float4x4(node.transform), rotationTransform))

这在大多数情况下都可以正常工作,但在某些情况下,对象会以完全奇怪的方式旋转。我应该设置 旋转角度除了当前欧拉角的倒数之外的其他任何东西?直接将角度设置为 0 根本不起作用。

【问题讨论】:

  • 你使用约束吗?
  • 不,我尝试使用 SCNLookAtConstraint 和 look(at:) 方法进行试验,但它们都不能满足我的需求
  • 能贴一下rotationMatrixAroundZ()的函数吗?

标签: ios swift rotation scenekit arkit


【解决方案1】:

我遇到了这个问题,发现我遇到了gimbal lock。解决方案是围绕一个轴旋转节点,将其作为另一个SCNNode() 的父节点,然后围绕另一个轴旋转父节点。希望对您有所帮助。

【讨论】:

  • 谢谢!我还以为是撞到云台锁了,没想到用这个办法解决!
  • 这是一个绝妙的解决方案!我made a wrapper class 这样可以很容易地在任何节点上应用所有 3 个旋转。
【解决方案2】:

您不必在矩阵上进行节点变换,您可以简单地围绕特定轴旋转,就旋转的逻辑而言,这可能会更简单一些。

你可以这样做:

node.runAction(SCNAction.rotateBy(x: x, y: y, z: z, duration: 0.0))

不确定这是否是您正在寻找的东西,但它比使用 SCNMatrix4 进行旋转更简单

【讨论】:

  • 感谢您的建议,尚未探索此选项。我试试看!
【解决方案3】:

好吧,我设法解决了问题,但我对它并不满意,所以我将不回答这个问题。基本上,我定义了 2 度的阈值并继续应用这些旋转,直到围绕 X 和 Z 的欧拉角都低于上述阈值。

func layDownNode(_ node: SCNNode) {
    let maxErrDegrees: Float = 2.0
    let maxErrRadians = GLKMathDegreesToRadians(maxErrDegrees)

    while (abs(node.eulerAngles.x) > maxErrRadians || abs(node.eulerAngles.z) > maxErrRadians) {
        let rotationZ = -node.eulerAngles.z
        let rotationX = -node.eulerAngles.x

        let rotationTransformZ = rotationMatrixAroundZ(radians: rotationZ)
        let rotationTransformX = rotationMatrixAroundX(radians: rotationX)

        let rotationTransform = simd_mul(rotationTransformX, rotationTransformZ)

        node.transform = SCNMatrix4(simd_mul(simd_float4x4(node.transform), rotationTransform))
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多