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

Jia*_*Jin 3 augmented-reality swift realitykit reality-composer

在 SceneKit 中,有很多选项,例如

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

我想知道是否有办法在 RealityKit 中为 ModelEntity 设置透明度/不透明度/alpha?

ARG*_*Geo 5

RealityKit 1.0

RealityKit 1.0 中有一种解决方案允许您控制对象的透明度。您可以使用baseColortintColor实例属性来做到这一点SimpleMaterial()

 var tintColor: NSColor { get set }
 var baseColor: NSColor { get set }

 var tintColor: UIColor { get set }
 var baseColor: UIColor { get set }
Run Code Online (Sandbox Code Playgroud)

iOS 解决方案(RealityKit 1.0 的颜色示例)

即使使用颜色参数,它也可以在 iOS 中完美运行:

import UIKit
import RealityKit

class GameViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        arView.backgroundColor = .black

        var material = SimpleMaterial()

        material.tintColor = UIColor.init(red: 1.0, 
                                        green: 1.0, 
                                         blue: 1.0, 
                                        alpha: 0.025)

        material.baseColor = MaterialColorParameter.color(UIColor.red)

        let mesh: MeshResource = .generateSphere(radius: 0.7)
        let modelEntity = ModelEntity(mesh: mesh,
                                 materials: [material])
        let anchor = AnchorEntity()
        anchor.addChild(modelEntity)
        arView.scene.anchors.append(anchor)
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

macOS 解决方案(RealityKit 1.0 的纹理示例):

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)
Run Code Online (Sandbox Code Playgroud)

或者,如果您不需要模型上的任何纹理(只需要不透明度的颜色),您可以通过baseColor实例属性控制透明度:

material.baseColor = MaterialColorParameter.color(.init(red: 0.0,
                                                      green: 1.0, 
                                                       blue: 1.0, 
                                                      alpha: 0.5))
Run Code Online (Sandbox Code Playgroud)

如果您的场景包含两种类型的对象 - 在 Reality Composer 中制作并在 Xcode 中以编程方式制作,并且您为这两个对象分配相同的材质 - 已编译的应用程序将呈现一些渲染人工制品(请看下图)。

在此处输入图片说明

这是由于 RealityKit 的工作不稳定(因为目前框架还太年轻)。我认为在下一个版本的 RealityKit 中,诸如missing texture on Reality Composer modelweird reflection left from sphere将被消除。


RealityKit 2.0

在 RealityKit 2.0 中,AR 团队的工程师给了我们一个.color属性而不是.baseColor.tintColor。提到的这两个在 iOS 15 中已弃用。

iOS 解决方案(RealityKit 2.0 的颜色示例)

var material = SimpleMaterial()

material.color =  .init(tint: .red.withAlphaComponent(0.05), texture: nil)

material.baseColor       // deprecated in iOS 15
material.tintColor       // deprecated in iOS 15
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

iOS 解决方案(RealityKit 2.0 的纹理示例)

可以使用相同的初始化程序应用纹理:

material.color = try! .init(tint: .white.withAlphaComponent(0.9999),
                         texture: .init(.load(named: "mat.png", in: nil)))
Run Code Online (Sandbox Code Playgroud)

特别注意tint乘数——0.9999如果你的纹理有透明部分,你必须使用值。

  • 如果您在初始创建模型实体后更新网格大小,https://twitter.com/MaxxFrazer/status/1364947082981818374?s=20 不透明度不起作用。这是另一个 Realitykit 错误,也是我认为你的解决方案不起作用的原因:)为你修复了投票 (2认同)