SceneKit。如何围绕其轴旋转SCNNode

5
我正在尝试通过代码实现与场景编辑器中相同的旋转效果,使对象始终围绕所选轴旋转。然而,如果我查看编辑器中的角度(x、y、z),它们会随机更改。
![本地节点轴][1]
我尝试过使用四元数,但无法使其正常工作。
PS:我的错误是使用旋转属性而不是SCNVector4的方向属性,现在已经阅读了文档。

你找到解决方案了吗?我也遇到了同样的问题。 - Anton Plebanovich
2个回答

8

看起来你很接近了,你需要在GLKQuaternionMultiply的调用中交换参数。我使用https://dev59.com/bJjga4cB1Zd3GeqPP9fn#39813058中的解决方案仅通过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)

0
通过设置旋转属性,改变对象的绝对旋转而不是相对旋转。
以下是一些伪代码:
  1. 计算表示相对旋转的四元数。我会使用GLKQuaternionMakeWithAngleAndAxis函数来完成。
  2. 将旋转应用于方向属性:
    let initial_object_orientation = rotateNode.orientation; new_orientation = GLKQuaternionMultiply(rotation_quaternion, initial_object_orientation)
  3. 分配新方向
    rotatNode.orientation = new_orientation
    希望这有所帮助。

重写了代码,加入了你的假设。看起来更友好了,但仍然有奇怪的问题。 - Андрей Первушин
你好!我们可以将问题分为两个部分。1- 你需要在一个球体上定位相机。球体的半径将随着所需的缩放级别而变化(除非你使用相机FOV进行缩放)。2- 你可以使用SCNLookAtConstraint,使相机始终指向(旋转)所选节点。 - Karl Sigiscar
抱歉,这似乎与我的问题无关。 - Андрей Первушин
所选节点将成为用于定位相机的虚拟球体的中心。相机始终朝向所选节点内部。 - Karl Sigiscar
仍然无法理解您的想法。我没有定位相机,请仔细阅读或解释一下您在代码和示例中的意思。 - Андрей Первушин

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接