Intereting Posts

SceneKit SCNAction.run и вращение не работают

У меня есть сцена с ящиком, на котором нужно запустить действие вращения навсегда:

dps – это свойство, которое может быть изменено пользователем.

 override func viewDidAppear() { super.viewDidAppear() let scene = SCNScene() scene.rootNode.addChildNode(boxNode) self.rateScene.scene = scene let actionwait = SCNAction.wait(duration: 0.001) let run = SCNAction.run {_ in let fps = 60.0 let delta = (self.dps*3.14/180.0)/fps self.boxNode.rotation.z -= CGFloat(delta) } let moveSequence = SCNAction.sequence([actionwait, run]) let forever = SCNAction.repeatForever(moveSequence) boxNode.runAction(forever) } 

Variable self.boxNode.rotation.z – изменяется каждый раз, но окно не вращается.

Это не будет работать, потому что SCNAction.run просто оценивается один раз. Вы должны переназначить действие каждый раз, когда вы меняете значение.

То, что вы могли бы сделать, это нечто подобное. Проще говоря, этот код в IBAction вашего слайдера (или того, что пользователь использует для управления значением)

 let fps = 60.0 let delta = (self.dps * 3.14 / 180.0) / fps SCNTransaction.begin() SCNTransaction.animationDuration = 0.1 boxNode.rotation.z -= Float(delta) SCNTransaction.commit() 

Как насчет сохранения свойства DPS на сцене или владельца сцены и использования didSet в DPS? Команда didSet сбросит вращение, что-то вроде:

 let radiansPerSecond = M_PI / 180.0 * dps let rotate = SCNAction.repeatForever(SCNAction.rotateBy(x: 0.0, y: 0, z: radiansPerSecond, duration: 1.0)) boxNode.runAction(rotate) 

Изменение DPS может быть обнаружено в течение 1 секунды, и ваше действие перезапускается с новой скоростью вращения. И вам не нужно устанавливать новую SCNAction 60 раз в секунду.