RealityKit - анимировать непрозрачность ModelEntity?

Установив цвет материала в свойстве model объекта ModelEntity, я могу изменить непрозрачность / альфа-канал объекта. Но как это оживить? Моя цель - анимировать объекты с полной непрозрачностью, а затем заставить их исчезнуть до установленной непрозрачности, например, 50%.

С SCNAction.fadeOpacity на SCNNode в SceneKit это было особенно легко.

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

Entity соответствует HasTransform, но это позволит вам только анимировать масштаб, положение и ориентацию. Ничего общего с анимацией материала для чего-то вроде его появления или исчезновения. Эффект есть в RealityComposer, если вы создаете поведение для анимации скрытия или показа, но, похоже, нет чего-то похожего на HasTransform, чтобы обеспечить функциональность для анимации непрозрачности.

Я просматривал документацию в поисках чего-то, моя следующая идея, по сути, заключается в создании пользовательской анимации для замены этого поведения, но похоже, что она должна быть доступна, а я просто не нахожу ее.


person ColdLogic    schedule 16.01.2020    source источник


Ответы (4)


Я протестировал это с использованием разных техник и пришел к печальному выводу: вы не можете анимировать непрозрачность материала в среде 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)
        })
    }
}
person Andy Fedoroff    schedule 16.01.2020

Как говорит @AndyFedo, в настоящее время нет возможности анимировать непрозрачность или альфа-канал Entity.

Даже изменение SimpleMaterial во время выполнения в настоящее время приводит к мерцанию.

Сказав это, я смог оживить альфа-версию 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()

Также я бы вежливо попросил, чтобы этот ответ не получил отрицательного ответа, поскольку я просто повторяю тот факт, что (а) это невозможно с любыми текущими встроенными методами и (б) что это может быть частично достигнуто, хотя и очень ограниченный объем (и, следовательно, в настоящее время; таким образом, который можно было бы посчитать пригодным для производства).

person BlackMirrorz    schedule 18.01.2020

Я не знаю, подходит ли это вашему варианту использования. Но следует учитывать видеоматериал. Как вы можете видеть в этом сеансе WWDC (2 мин 45). Сущность со сложной пульсирующей непрозрачностью.

https://developer.apple.com/videos/play/wwdc2020/10612/ < / а>

person glemoulant    schedule 16.10.2020

вы также можете создать эффект постепенного появления в Reality Composer и запустить файл .rcproject в Xcode. Не тестировал другие взаимодействия с .rcproject, но я знаю, что, по крайней мере, это может загрузить модель, которая исчезнет в сцене.

person Myoung    schedule 04.03.2021