RealityKit - анимация непрозрачности объекта ModelEntity? - PullRequest
2 голосов
/ 16 января 2020

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 января 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()

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

0 голосов
/ 16 января 2020

Я протестировал его, используя различные методы, и пришел к печальному выводу: вы не можете анимировать непрозрачность материала в платформе 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)
        })
    }
}
...