Swift SceneKit-如何添加动画以更改SCNNode';什么颜色?
我想知道如何使用Swift设置SCNNode颜色的动画 例如:我希望节点不断改变颜色,或者我希望节点从黑色淡入蓝色Swift SceneKit-如何添加动画以更改SCNNode';什么颜色?,swift,scenekit,Swift,Scenekit,我想知道如何使用Swift设置SCNNode颜色的动画 例如:我希望节点不断改变颜色,或者我希望节点从黑色淡入蓝色 我是否使用“淡入淡出”或“淡出淡出”功能?您可以创建自定义操作 如果场景中有一个红色球体 let sphereNode = scene.rootNode.childNode(withName: "sphere", recursively: false)! sphereNode.geometry!.firstMaterial!.diffuse.contents = UIColor.r
我是否使用“淡入淡出”或“淡出淡出”功能?您可以创建自定义操作 如果场景中有一个红色球体
let sphereNode = scene.rootNode.childNode(withName: "sphere", recursively: false)!
sphereNode.geometry!.firstMaterial!.diffuse.contents = UIColor.red
这就是构建自定义操作的方式
let changeColor = SCNAction.customAction(duration: 10) { (node, elapsedTime) -> () in
let percentage = elapsedTime / 5
let color = UIColor(red: 1 - percentage, green: percentage, blue: 0, alpha: 1)
node.geometry!.firstMaterial!.diffuse.contents = color
}
最后,您只需要在球体上运行操作
sphereNode.runAction(changeColor)
结果
从@Luca Angeletti那里得到了灵感,我编写了代码,这样我们就可以在任何颜色之间制作动画,包括它们的字母:
func aniColor(from: UIColor, to: UIColor, percentage: CGFloat) -> UIColor {
let fromComponents = from.cgColor.components!
let toComponents = to.cgColor.components!
let color = UIColor(red: fromComponents[0] + (toComponents[0] - fromComponents[0]) * percentage,
green: fromComponents[1] + (toComponents[1] - fromComponents[1]) * percentage,
blue: fromComponents[2] + (toComponents[2] - fromComponents[2]) * percentage,
alpha: fromComponents[3] + (toComponents[3] - fromComponents[3]) * percentage)
return color
}
使用:
我正在使用这个函数;
您只需给出材质的名称、动画所需的时间以及当前的颜色和颜色
将达到的颜色
以数组的形式给出颜色(红色、绿色、蓝色和alpha)
这就是调用函数的方式
changeColorWithAnimation(duration : 5,
materialName: myCubeMaterial,
start : startColor,
end : targetColor)
func chageColorWithAnimation(duration: CGFloat,
materialName: SCNMaterial,
start: [CGFloat],
end: [CGFloat]){
let rs = (end[0] - start[0]) / duration
let gs = (end[1] - start[1]) / duration
let bs = (end[2] - start[2]) / duration
let alphas = (end[3] - start[3]) / duration
let changeColor = SCNAction.customAction(duration: TimeInterval(duration)) { (node, elapsedTime) -> () in
let red = start[0] + rs * elapsedTime
let green = start[1] + gs * elapsedTime
let blue = start[2] + bs * elapsedTime
let alpha = start[3] + alphas * elapsedTime
materialName.diffuse.contents = UIColor(displayP3Red:red,
green: green,
blue: blue,
alpha: alpha)
}
rootNode.runAction(changeColor)
}
let startColor: [CGFloat] = [0.5, 0.5, 1, 1]
let targetColor: [CGFloat] = [1, 1, 1, 1]
changeColorWithAnimation(duration : 5,
materialName: myCubeMaterial,
start : startColor,
end : targetColor)
func chageColorWithAnimation(duration: CGFloat,
materialName: SCNMaterial,
start: [CGFloat],
end: [CGFloat]){
let rs = (end[0] - start[0]) / duration
let gs = (end[1] - start[1]) / duration
let bs = (end[2] - start[2]) / duration
let alphas = (end[3] - start[3]) / duration
let changeColor = SCNAction.customAction(duration: TimeInterval(duration)) { (node, elapsedTime) -> () in
let red = start[0] + rs * elapsedTime
let green = start[1] + gs * elapsedTime
let blue = start[2] + bs * elapsedTime
let alpha = start[3] + alphas * elapsedTime
materialName.diffuse.contents = UIColor(displayP3Red:red,
green: green,
blue: blue,
alpha: alpha)
}
rootNode.runAction(changeColor)
}