RealityKit –如何设置ModelEntity的透明度?

时间:2019-11-28 08:08:06

标签: swift augmented-reality realitykit reality-composer

SceneKit中有很多选项,例如

  • 通过SCNMaterial.(diffuse|emission|ambient|...).contents来使用UIColor的Alpha通道
  • 使用SCNMaterial.transparency(CGFloat从0.0到1.0)
  • 使用SCNMaterial.transparent(另一个SCNMaterialProperty)
  • 使用SCNNode.opacity(CGFloat从0.0(完全透明)到1.0 (完全不透明))

我想知道是否可以在RealityKit中为ModelEntity设置透明度/不透明度/ alpha吗?

2 个答案:

答案 0 :(得分:0)

此刻,我在RealityKit中看到了至少一个解决方案,允许您控制对象的透明度。但坦率地说,该解决方案仅适用于以编程方式制作的模型,因此您不能将其应用于Reality Composer的模型。您可以使用baseColor的{​​{1}}或tintColor实例属性来做到这一点:

SimpleMaterial()

这是真实代码的样子(我在macOS中对其进行了测试):

 var tintColor: NSColor { get set }     /*  color applied to the base color in macOS  */
 var baseColor: NSColor { get set }     /*  main (base) color in RealityKit macOS    */ 

或者,如果您不需要模型上的任何纹理(只需具有不透明度的颜色),就可以通过var material = SimpleMaterial() // CYAN TINT and SEMI-TRANSPARENT ALPHA material.tintColor = NSColor.init(red: 0.0, green: 1.0, blue: 1.0, alpha: 0.5) material.baseColor = try! MaterialColorParameter.texture(TextureResource.load(contentsOf: url)) material.roughness = MaterialScalarParameter(floatLiteral: 0.0) material.metallic = MaterialScalarParameter(floatLiteral: 1.0) // CUBE WAS MADE IN REALITY COMPOSER cubeComponent.materials = [material] // SPHERE IS MADE PROGRAMMATICALLY let mesh: MeshResource = .generateSphere(radius: 0.7) let sphereComponent = ModelComponent(mesh: mesh, materials: [material]) anchor.steelBox!.components.set(cubeComponent) anchor.components.set(sphereComponent) arView.scene.anchors.append(anchor) 实例属性来控制透明度:

baseColor
  

如果您的场景包含两种类型的对象(由Reality Composer制作并以Xcode编程方式创建,并且您将相同的材质分配给这两个对象),则编译后的应用程序会呈现一些渲染伪像(请看下面的图片)。

enter image description here

  

这是因为RealityKit的工作不稳定(因为目前框架太小)。我认为在RealityKit的下一版本中,诸如material.baseColor = MaterialColorParameter.color(.init(red: 0.0, green: 1.0, blue: 1.0, alpha: 0.5)) missing texture on Reality Composer model之类的错误将被消除。

答案 1 :(得分:-1)

我找到了几种方法来做到这一点。

  1. 没有动画,最简单的方法是使用OcclusionMaterial()
let plane = ModelEntity(
                       mesh: .generatePlane(width: 0.1, depth: 0.1), 
                       materials: [OcculusionMaterial()]
            )

更改现有实体的不透明度:

plane.model?.materials = [OcclusionMaterial()]
  1. 带有动画(您可以根据需要调整以下代码段):
var planeColor = UIColor.blue

func fadeOut() {
        runTimer(duration: 0.25) { (percentage) in
            let color = self.planeColor.withAlphaComponent(1 - percentage)
            var material: Material = SimpleMaterial(color: color, isMetallic: false)
            if percentage >= 0.9 {
                material = OcclusionMaterial()
            }
            self.plane.model?.materials = [material]
        }

}

func fadeIn() {
        runTimer(duration: 0.25) { (percentage) in
            let color = self.planeColor.withAlphaComponent(percentage)
            let material: Material = SimpleMaterial(color: color, isMetallic: false)

            self.plane.model?.materials = [material]
        }
}

func runTimer(duration: Double, completion: @escaping (_ percentage: CGFloat) -> Void) {
        let startTime = Date().timeIntervalSince1970
        let endTime = duration + startTime

        Timer.scheduledTimer(withTimeInterval: 1 / 60, repeats: true) { (timer) in
            let now = Date().timeIntervalSince1970

            if now > endTime {
                timer.invalidate()
                return
            }
            let percentage = CGFloat((now - startTime) / duration)
            completion(percentage)

        }
}

希望这对某人有所帮助