【发布时间】:2018-01-29 18:30:52
【问题描述】:
我有一个(Omni 类型的)灯,我希望它有点动画。更准确地说,我想模仿文件中的光,所以我希望它是attenuationStartDistance 来更改值,color 也是如此。那么,有什么方法可以在光上运行这样的序列,或者我必须找到一个小技巧来做到这一点?
【问题讨论】:
我有一个(Omni 类型的)灯,我希望它有点动画。更准确地说,我想模仿文件中的光,所以我希望它是attenuationStartDistance 来更改值,color 也是如此。那么,有什么方法可以在光上运行这样的序列,或者我必须找到一个小技巧来做到这一点?
【问题讨论】:
查看文档:
attenuationStartDistance: 距离强度开始减弱的光源的距离。动画。...
您可以动画更改此属性的值。见Animating SceneKit Content。
对于连续动画,您可以这样做:
let flicker = CABasicAnimation(keyPath: "light.attenuationStartDistance")
flicker.fromValue = 100
flicker.toValue = 110
flicker.autoreverses = true
flicker.repeatCount = .infinity
lightNode.addAnimation(flicker, forKey: nil)
【讨论】:
更现代的方法是使用自定义SCNAction:
let flickerUp = SCNAction.customAction(duration: 1) { (node, _) in
node.light?.attenuationStartDistance = 110
}
let flickerDown = SCNAction.customAction(duration: 1) { (node, _) in
node.light?.attenuationStartDistance = 100
}
let repeat = SCNAction.repeatForever(SCNAction.sequence([flickerUp, flickerDown]))
node.runAction(repeat)
【讨论】: