5

model通过在 a 的属性上设置材质的颜色ModelEntity,我可以更改对象的不透明度/alpha。但是你如何动画呢?我的目标是为具有完全不透明度的对象设置动画,然后让它们淡化到设定的不透明度,例如 50%。

使用SCNAction.fadeOpacityon a SCNNodein SceneKit,这特别容易。

let fade = SCNAction.fadeOpacity(by: 0.5, duration: 0.5)
node.runAction(fade)

AnEntity符合HasTransform,但这只允许您为比例、位置和方向设置动画。与材质的动画无关,例如淡入或淡出。如果您创建用于动画隐藏或显示的行为,则效果在 RealityComposer 中,但似乎没有类似的东西HasTransform来提供动画不透明度的功能。

我一直在文档中寻找一些东西,我的下一个想法本质上是创建一个自定义动画来替换这种行为,但它似乎应该可用,我只是没有找到它。

4

4 回答 4

1

我使用不同的技术对其进行了测试,得出了一个悲惨的结论:你不能在 RealityKit 框架中为材质的不透明度设置动画,因为RealityKit materials don't support animation at runtime(现在我希望如此)。让我们等待 RealityKit 的重大更新。

这是您可以用于测试的代码

arView.alpha属性只是工作):

import UIKit
import RealityKit

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        arView.alpha = 1.0 
        opacityAnimation()
    }

    func opacityAnimation() {

        UIView.animate(withDuration: 5.0,
                         animations: {

            self.arView.alpha = 0.0
        })
    }
}

并使用此代码片段以确保动画无法正常工作

(没有动画过程,只是赋值):

import UIKit
import RealityKit

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!
    let tetheringAnchor = AnchorEntity(world: [0,0,0])
    var material = SimpleMaterial()
    let mesh: MeshResource = .generateSphere(radius: 0.5)
    var sphereComponent: ModelComponent? = nil

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        material.metallic = .float(1.0)
        material.roughness = .float(0.0)
        material.baseColor = .color(.red)

        sphereComponent = ModelComponent(mesh: mesh,
                                    materials: [material])

        tetheringAnchor.components.set(sphereComponent!)
        arView.scene.anchors.append(tetheringAnchor)

        opacityAnimation()
    }

    func opacityAnimation() {

        UIView.animate(withDuration: 5.0,
                         animations: {

            self.material.metallic = .float(1.0)
            self.material.roughness = .float(0.0)
            self.material.baseColor = .color(.green)

            self.sphereComponent = ModelComponent(mesh: self.mesh,
                                             materials: [self.material])

            self.tetheringAnchor.components.set(self.sphereComponent!)
            self.arView.scene.anchors.append(self.tetheringAnchor)
        })
    }
}
于 2020-01-16T11:59:48.670 回答
1

正如@AndyFedo 所说,目前没有办法为Entity.

即使SimpleMaterial在运行时更改 a 当前也会导致闪烁。

话虽如此,我能够为 a 的 Alpha 设置动画SimpleMaterials Color,但是根据测试,它绝不是最佳的或推荐的。

但以防万一您想尝试进一步尝试此途径,请参阅附加示例,该示例假定您只有一个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)它可以部分实现,尽管非常范围有限(因此目前;以一种人们认为适合生产的方式)。

于 2020-01-18T05:25:28.900 回答
0

您还可以在 Reality Composer 中创建淡入淡出体验并在 Xcode 中触发 .rcproject 文件。尚未测试与 .rcproject 的其他交互,但我知道至少这可以加载模型以淡入场景。

于 2021-03-04T20:46:33.180 回答
0

我不知道它是否适合您的用例。但是你应该考虑视频材料。正如您在本次 WWDC 会议 (2min45) 中所见。具有复杂脉动不透明度的实体。

https://developer.apple.com/videos/play/wwdc2020/10612/

于 2020-10-16T15:56:47.460 回答