SceneKit SCNAction.run 和旋转不起作用
SceneKit SCNAction.run and rotation not working
我有一个场景,其中有一个框,应该 运行 永远旋转:
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
- 每次都改变,但框不旋转。
这行不通,因为 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 属性,并在 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 次。
我有一个场景,其中有一个框,应该 运行 永远旋转:
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
- 每次都改变,但框不旋转。
这行不通,因为 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 属性,并在 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 次。