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

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

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

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

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


person Amit Kalra    schedule 21.07.2017    source источник


Ответы (1)


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

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

Изменить:

let action = SCNAction.repeatForever(SCNAction.rotate(by: .pi, around: SCNVector3(0, 1, 0), duration: 5))
box.runAction(action)

Вы можете изменить преобразование следующим образом

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()

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

person jlsiewert    schedule 21.07.2017
comment
Что такое axis.x, y, z и угол? Когда я делаю SCNMatrix4MakeRotation, он устанавливает это по умолчанию: угол, x, y, z. Я не знаю, что вставить в эти значения? Я ставлю тот же xyz, что и моя позиция? И для угла я делаю 360, чтобы он вращался полностью? Спасибо! - person Amit Kalra; 22.07.2017
comment
Я обновил вопрос, чтобы он звучал более ясно. Я хочу эффект вращения баскетбольного мяча! - person Amit Kalra; 22.07.2017
comment
axis — это ось, вокруг которой вы хотите вращаться, например, [0, 1, 0] или worldUp, в зависимости от того, хотите ли вы вращаться вокруг локальной или глобальной оси Y, а angle — это угол поворота в радианах, поэтому .pi * 2 означает полный поворот. - person jlsiewert; 22.07.2017
comment
О, хорошо, так что я могу установить ось на 0 и просто изменить угол? Или я должен установить xyz таким же, как моя позиция? - person Amit Kalra; 22.07.2017
comment
Ось - это ось вращения, поэтому используйте (1, 0, 0), если вы хотите вращаться вокруг оси x, (0,1,0) для оси узлов y и (0,0,1) для оси z. - person jlsiewert; 22.07.2017
comment
Так что же делает box.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 1, y: 0, z: 0, продолжительность: 1)), forKey: Change)? Ничего не происходит вообще, и когда я это делаю, ничего не происходит :( (вращение, старое преобразование) SCNTransaction.commit() - person Amit Kalra; 22.07.2017
comment
Хорошо, этот код работает так, как я хочу. Он вращается, но двигает коробку вокруг себя, не оставляет коробку на месте, а просто крутит ее. - person Amit Kalra; 22.07.2017