Как заставить SCNNode вращаться / вращаться горизонтально

Я пытаюсь заставить мой SCNNode автоматически поворачиваться горизонтально. Это код, который я до сих пор:

box.scale = SCNVector3(x: 0.26, y: 0.26, z: 0.26)
box.position = SCNVector3(0.15, 3.85, -3)

Как сделать так, чтобы этот ящик вращался по горизонтали автоматически? И для плюса, есть ли способ сделать это при включенном взаимодействии с пользователем тоже? Спасибо!

Обновление: Если я не звучу так ясно, это то, что я имею в виду: вы знаете, когда вы крутите баскетбол на пальце и как он вращается горизонтально? Это тот эффект, которого я пытаюсь достичь! Спасибо!

2 ответа

Решение

Вы также можете

  • использовать SCNAction класс, например SCNAction.rotate(by:around:duration:), Это имеет то преимущество, что вы можете связывать несколько анимаций или повторять их вечно,

Редактировать:

let action = SCNAction.repeatForever(SCNAction.rotate(by: .pi, around: SCNVector3(0, 1, 0), duration: 5))
box.runAction(action)
  • использование SCNTransaction,

Вы можете изменить преобразование, как это

let oldTransform = box.transform
let rotation = SCNMatrix4MakeRotation(axis.x, axis.y, axis.z angle)
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
box.transform = SCNMatrix4Mult(rotation, oldTransform)
SCNTransaction.commit()

Для использования пользовательского ввода вы можете, например, изменить угол поворота или продолжительность с помощью распознавателя жестов.

SwiftUI с использованием SceneView обновил принятый ответ с помощью немного более нового синтаксиса.

Хорошо работает на iOS14/iOS15

          let oldTransform = cubeNode.transform
    let rotation = SCNMatrix4MakeRotation(GLKMathDegreesToRadians(90), 0, 1, 0)
    SCNTransaction.begin()
    SCNTransaction.animationDuration = 0.5
    cubeNode.transform = SCNMatrix4Mult(rotation, oldTransform)
    SCNTransaction.commit()
Другие вопросы по тегам