SceneKit。如何围绕其轴旋转SCNNode

时间:2016-12-20 12:23:07

标签: rotation axis scenekit scnnode

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

![本地节点轴] [1]

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

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

2 个答案:

答案 0 :(得分:6)

似乎你真的很接近,你必须在GLKQuaternionMultiply电话中交换参数。我使用https://stackoverflow.com/a/39813058/4124265中的解决方案仅通过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)

答案 1 :(得分:0)

通过设置旋转属性,可以更改对象的绝对旋转,而不是相对旋转。

这里有一些伪代码

  1. 计算四元数表示相对旋转。我会使用GLKQuaternionMakeWithAngleAndAxis函数来执行此操作。
  2. 将旋转应用于orientation属性:
        let initial_object_orientation = rotateNode.orientation; new_orientation = GLKQuaternionMultiply(rotation_quaternion, initial_object_orientation)
  3. 指定新方向
        rotatNode.orientation = new_orientation
    希望它有所帮助。