SceneKit. How to rotate SCNNode around its axis

5.3k views Asked by At

I'm trying to achieve same rotation as in scene editor but with code so object always rotate around selected axis, however if I look at angles(x,y,z) in editor they changes quite randomly

![Local node axis][1]

I've tried to use quaternions, but can't get it working

PS. my bad was using rotation property instead of orientation both SCNVector4, have read doc properly)

2

There are 2 answers

0
Anton Plebanovich On BEST ANSWER

Seems you was really close, you had to swap parameters in GLKQuaternionMultiply call. I used solution in https://stackoverflow.com/a/39813058/4124265 to achieve rotation only by Z axis:

    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)

To rotate arround Y:

    // Rotate around Y axis
    let multiplier = GLKQuaternionMakeWithAngleAndAxis(0.5, 0, 1, 0)
    glQuaternion = GLKQuaternionMultiply(glQuaternion, multiplier)
5
Chung Hsuan Yeh On

By setting the rotation property, the absolute rotation of the object is changed, rather than the relative rotation.

Here's some pseudo code

  1. Compute the quaternion represents the relative rotation. I would use the GLKQuaternionMakeWithAngleAndAxis function to do so.
  2. Apply the rotation to the orientation property:
    let initial_object_orientation = rotateNode.orientation; new_orientation = GLKQuaternionMultiply(rotation_quaternion, initial_object_orientation)
  3. Assign the new orientation
    rotatNode.orientation = new_orientation
    Hope it helps.