2016-12-20 8 views
4

Я пытаюсь добиться такого же вращения, как в редакторе сцены, но с кодом, поэтому объект всегда вращается вокруг выбранной оси, однако, если я смотрю на углы (x, y, z) в редакторе, они меняются довольно случайноSceneKit. Как вращать SCNNode вокруг своей оси

! [ось Локальный узел] [1]

Я пытался использовать кватернионы, но не может заставить его работать

PS. мой плохой использовал свойство вращения вместо ориентации как SCNVector4, правильно прочитал документ)

+0

Вы нашли решение? У меня такая же проблема. –

ответ

2

Кажется, вы были очень близки, вам приходилось менять параметры в 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) 

Для вращения Arround 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
    Надеюсь, что это помогает.
+0

Переписанный код с вашими предположениями. Выглядит более дружелюбно, но все еще работает странно –

+0

Privet! Мы можем разделить проблему на две части. 1- Вы должны [поместить камеру в сферу] (http://mathinsight.org/spherical_coordinates). Радиус сферы будет варьироваться в зависимости от требуемого уровня масштабирования (если вы не используете камеру FOV для увеличения). 2 Вы можете использовать [SCNLookAtConstraint] (https://developer.apple.com/reference/scenekit/scnlookatconstraint), чтобы камера всегда указывает (вращается) к выбранному узлу. –

+0

Извините, это не похоже на мою проблему. –

Смежные вопросы