场景套件。如何绕轴旋转 SCNNode

SceneKit. How to rotate SCNNode around its axis

我正在尝试实现与场景编辑器中相同的旋转,但使用代码使对象始终围绕选定的轴旋转,但是如果我在编辑器中查看角度 (x,y,z),它们会随机变化

![局部节点轴][1]

我试过使用四元数,但无法正常工作

PS。我的错误是使用旋转 属性 而不是 SCNVector4 的方向,已正确阅读文档)

通过设置旋转属性,改变对象的绝对旋转,而不是相对旋转

这是一些伪代码

  1. 计算四元数表示相对旋转。我会使用 GLKQuaternionMakeWithAngleAndAxis 函数来做到这一点。
  2. 将旋转应用到方向 属性:
    let initial_object_orientation = rotateNode.orientation; new_orientation = GLKQuaternionMultiply(rotation_quaternion, initial_object_orientation)
  3. 分配新方向
    rotatNode.orientation = new_orientation
    希望对你有帮助。

看来你真的很接近,你不得不在 GLKQuaternionMultiply 调用中交换参数。我在 中使用解决方案仅通过 Z 轴实现旋转:

    let orientation = modelNode.orientation
    var glQuaternion = GLKQuaternionMake(orientation.x, orientation.y, orientation.z, orientation.w)

    // Rotate around Z axis
    let multiplier = GLKQuaternionMakeWithAngleAndAxis(0.5, 0, 0, 1)
    glQuaternion = GLKQuaternionMultiply(glQuaternion, multiplier)

    modelNode.orientation = SCNQuaternion(x: glQuaternion.x, y: glQuaternion.y, z: glQuaternion.z, w: glQuaternion.w)

围绕Y旋转:

    // Rotate around Y axis
    let multiplier = GLKQuaternionMakeWithAngleAndAxis(0.5, 0, 1, 0)
    glQuaternion = GLKQuaternionMultiply(glQuaternion, multiplier)