SceneKit. How to rotate SCNNode around its axis

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)

Upvotes: 5

Views: 5505

Answers (2)

Anton Plebanovich
Anton Plebanovich

Reputation: 1526

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)

Upvotes: 8

Chung Hsuan Yeh
Chung Hsuan Yeh

Reputation: 23

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.

Upvotes: 1

Related Questions