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