SceneKit SCNAction.run和旋转无法正常工作

时间:2016-11-15 10:42:23

标签: ios swift scenekit

我有一个带有一个盒子的场景,它应该永远运行一个旋转动作:

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 - 每次都会更改,但框不会旋转。

2 个答案:

答案 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上使用didSetdidSet将重置轮换,例如:

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次。