我有一个带有一个盒子的场景,它应该永远运行一个旋转动作:
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)
}
变量self.boxNode.rotation.z
- 每次都会更改,但框不会旋转。
答案 0 :(得分:3)
这不会起作用,因为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()
答案 1 :(得分:1)
如何在场景或场景所有者处保留DPS属性,并在DPS上使用didSet
? 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次。