Swift RealityKit-为模型实体的不透明度设置动画?
通过在Swift RealityKit-为模型实体的不透明度设置动画?,swift,augmented-reality,arkit,realitykit,reality-composer,Swift,Augmented Reality,Arkit,Realitykit,Reality Composer,通过在模型实体的模型属性上设置材质的颜色,我可以改变对象的不透明度/alpha。但是你如何制作动画呢?我的目标是用完全不透明度设置对象的动画,然后让它们淡入设置的不透明度,例如50% 在SceneKit中的SCNNode上使用SCNAction.fadeOpacity,这尤其容易 let fade = SCNAction.fadeOpacity(by: 0.5, duration: 0.5) node.runAction(fade) 一个实体符合HasTransform,但这只允许您设置缩放、
模型实体
的模型
属性上设置材质的颜色,我可以改变对象的不透明度/alpha。但是你如何制作动画呢?我的目标是用完全不透明度设置对象的动画,然后让它们淡入设置的不透明度,例如50%
在SceneKit
中的SCNNode
上使用SCNAction.fadeOpacity
,这尤其容易
let fade = SCNAction.fadeOpacity(by: 0.5, duration: 0.5)
node.runAction(fade)
一个实体
符合HasTransform
,但这只允许您设置缩放、位置和方向的动画。与材质的动画无关,例如淡入或淡出材质。如果您为隐藏或显示创建动画行为,但似乎没有类似于HasTransform
的功能来提供不透明度动画,则效果在RealityComposer中
我一直在文档中寻找一些东西,我的下一个想法是创建一个自定义动画来取代这种行为,但它似乎应该是可用的,我只是没有找到它
我使用不同的技术对其进行了测试,得出了一个悲惨的结论:在RealityKit框架中无法设置材质不透明度的动画,因为RealityKit材质在运行时不支持动画(我希望现在是这样)。让我们等待RealityKit的主要更新
这是一个可用于测试的代码
(arView.alpha
属性只起作用):
并使用此代码段以确保动画无法正常工作
(没有动画过程,只有赋值):
正如@AndyFedo所说,目前没有办法对实体的透明度和alpha设置动画
即使在运行时更改SimpleMaterial
,当前也会导致闪烁
话虽如此,我还是能够为SimpleMaterials Color
的Alpha设置动画,但是基于测试,它在这方面并不是最优的,也不是推荐的
但是,为了以防万一,您想尝试进一步试验这一途径,请参阅附件中的示例,该示例假定您只有一个SimpleMaterial
:
class CustomBox: Entity, HasModel, HasAnchoring {
var timer: Timer?
var baseColour: UIColor!
//MARK:- Initialization
/// Initializes The Box With The Desired Colour
/// - Parameter color: UIColor
required init(color: UIColor) {
self.baseColour = color
super.init()
self.components[ModelComponent] = ModelComponent(mesh: .generateBox(size: [0.2, 0.2, 0.2]),
materials: [SimpleMaterial (color: baseColour, isMetallic: false)]
)
}
required init() { super.init() }
//MARK:- Example Fading
/// Fades The Colour Of The Entities Current Material
func fadeOut() {
var alpha: CGFloat = 1.0
timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { timer in
if alpha == 0 {
timer.invalidate()
return
}
var material = SimpleMaterial()
alpha -= 0.01
material.baseColor = MaterialColorParameter.color(self.baseColour.withAlphaComponent(alpha))
material.metallic = .float(Float(alpha))
material.roughness = .float(Float(alpha))
DispatchQueue.main.async {
self.model?.materials = [material]
}
}
}
}
因此,为了进行测试,您可以创建并调用函数,如下所示:
let box = CustomBox(color: .green)
box.position = [0,0,-0.5]
arView.scene.anchors.append(box)
box.fadeOut()
我还要礼貌地问,这个答案不要被否决,因为我只是重复了以下事实:(a)任何当前的内置方法都不可能实现,以及(b)它可以部分实现,尽管实现的程度非常有限(因此,目前;以一种人们认为适合生产的方式) 我不知道它是否适合您的用例。但是你应该考虑录像材料。
正如您在本次WWDC会话(2min45)中所看到的。具有复杂搏动性不透明的实体
您还可以创建“现实中的淡入体验”合成器,并在Xcode中触发.rcproject文件。我还没有测试过与.rcproject的其他交互,但我知道至少这可以加载一个模型以淡入场景
class CustomBox: Entity, HasModel, HasAnchoring {
var timer: Timer?
var baseColour: UIColor!
//MARK:- Initialization
/// Initializes The Box With The Desired Colour
/// - Parameter color: UIColor
required init(color: UIColor) {
self.baseColour = color
super.init()
self.components[ModelComponent] = ModelComponent(mesh: .generateBox(size: [0.2, 0.2, 0.2]),
materials: [SimpleMaterial (color: baseColour, isMetallic: false)]
)
}
required init() { super.init() }
//MARK:- Example Fading
/// Fades The Colour Of The Entities Current Material
func fadeOut() {
var alpha: CGFloat = 1.0
timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { timer in
if alpha == 0 {
timer.invalidate()
return
}
var material = SimpleMaterial()
alpha -= 0.01
material.baseColor = MaterialColorParameter.color(self.baseColour.withAlphaComponent(alpha))
material.metallic = .float(Float(alpha))
material.roughness = .float(Float(alpha))
DispatchQueue.main.async {
self.model?.materials = [material]
}
}
}
}
let box = CustomBox(color: .green)
box.position = [0,0,-0.5]
arView.scene.anchors.append(box)
box.fadeOut()