Преобразование и вращение в Scenekit

У меня есть узел SCN, который я преобразовал в желаемое вращение и угол.

Теперь я хочу вращать его бесконечно по новой оси X, но я не могу заставить его вращаться на 360 градусов, он просто слегка сдвигается.

let spin = CABasicAnimation(keyPath: "rotation")
spin.fromValue = NSValue(SCNVector4: SCNVector4(x: item.rotation.x, y: item.rotation.y, z: item.rotation.z, w: item.rotation.w))
spin.toValue = NSValue(SCNVector4: SCNVector4(x: Float(2*M_PI), y: item.rotation.y, z: item.rotation.z, w: item.rotation.w))
spin.duration = 3
spin.repeatCount = .infinity
item.addAnimation(spin, forKey: "spin around")

Обратите внимание, что я нашел код поворота из предыдущего вопроса, и он работает, как и ожидалось, но не, если я хочу вращаться на преобразованном узле.

РЕДАКТИРОВАТЬ: Код преобразования:

self.item.transform = SCNMatrix4Mult(SCNMatrix4Mult(SCNMatrix4MakeScale(1.1, 1.1, 1.1), SCNMatrix4MakeRotation(2.2, 228.0, 120.0, 55.2)), SCNMatrix4MakeTranslation(-2.5, 12, 6))
self.item.pivot = SCNMatrix4MakeTranslation(0, 0, 4)
self.item.transform = SCNMatrix4Mult(SCNMatrix4MakeTranslation(0, 0, 4), item.transform)

1 ответ

Решение

В ответ на ваш комментарий и, возможно, вашу проблему. Установив файл.dae, вы можете получить доступ к узлам, как показано в следующем примере:

    // "rhodopsin" is the namne of a .dae file
    guard let rho = SCNScene(named: "rhodopsin") else {
        print("Couldn't find molecule in dictionary  (rhodopsin)")
        return  }

    let chain = rho.rootNode.childNodeWithName("chain", recursively: true)!
    let hetero = rho.rootNode.childNodeWithName("hetero", recursively: true)!

Если вам нужно найти имена этих узлов, откройте файл.dae в окне редактора и нажмите на маленькую иконку боковой панели внизу слева. В этой боковой панели находится граф сцены (рис. Ниже). Вы можете не только наблюдать за иерархией, вы можете переименовывать и, при необходимости, перемещать узлы и перерисовывать (осторожно). Возможно, вам придется добавить другие меры предосторожности против файла, который не был найден. Я использую это для создания архивов, а не на стороне клиента.

Чтобы продолжить пример:

    baseNode.addChildNode(chain)
    baseNode.addChildNode(hetero)
    // (baseNode is a child of the current scene's root node) 

Теперь они ведут себя так же, как узлы, которые вы создали в SceneKit, В моем примере, если chain имел некоторую измененную ориентацию, которая мешала легкой анимации, скажем, относительно оси Y в мире, могла вращаться baseNode вместо. Или если это нужно вращение отдельно от hetero Я вместо этого поместил бы это в новый, иначе пустой узел и повернул бы это.

    let panNode = SCNNode()
    panNode.addChildNode(chain)
    baseNode.addChildNode(panNode)
    // perform rotations on panNode or baseNode

Где получить информацию об узле из файла Dae

Другие вопросы по тегам