Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift RealityKit-为模型实体的不透明度设置动画?_Swift_Augmented Reality_Arkit_Realitykit_Reality Composer - Fatal编程技术网

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()