Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)

like image 434
Андрей Первушин Avatar asked Dec 20 '16 12:12

Андрей Первушин


Video Answer


1 Answers

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)
like image 146
Anton Plebanovich Avatar answered Nov 06 '22 17:11

Anton Plebanovich