如何在 RealityKit 中以编程方式将 Material 添加到 ModelEntity?

How to Add Material to ModelEntity programatically in RealityKit?

RealityKit 的文档包括结构:OcclusionMaterialSimpleMaterialUnlitMaterial,用于将 material 添加到 ModelEntity .

或者,您可以加载附加了 material 的模型。

我想以编程方式将自定义 material/texture 添加到 ModelEntity。我如何在不将 material 添加到 Reality Composer 或其他一些 3D 软件 的模型中的情况下即时实现此目的?

更新时间:2022 年 5 月 22 日

RealityKit 材料

RealityKit 2.0RealityFoundation目前有6种材质:

要应用这些材料,请使用以下逻辑:

import Cocoa
import RealityKit

class ViewController: NSViewController {        
    @IBOutlet var arView: ARView!
    
    override func awakeFromNib() {
        let box = try! Experience.loadBox()
        
        var simpleMat = SimpleMaterial()
        simpleMat.color = .init(tint: .blue, texture: nil)
        simpleMat.metallic = .init(floatLiteral: 0.7)
        simpleMat.roughness = .init(floatLiteral: 0.2)
        
        var pbr = PhysicallyBasedMaterial()
        pbr.baseColor = .init(tint: .green, texture: nil) 

        let mesh: MeshResource = .generateBox(width: 0.5, 
                                             height: 0.5, 
                                              depth: 0.5, 
                                       cornerRadius: 0.02, 
                                         splitFaces: true)

        let boxComponent = ModelComponent(mesh: mesh,
                                     materials: [simpleMat, pbr])

        box.steelBox?.children[0].components.set(boxComponent)
        box.steelBox?.orientation = Transform(pitch: .pi/4, 
                                                yaw: .pi/4, 
                                               roll: 0).rotation
        arView.scene.anchors.append(box)
    }
}


如何创建类似于 SceneKit 着色器的 RealityKit 着色器

我们知道在 SceneKit 中有 5 种不同的着色模型,所以我们可以使用 RealityKit 的 SimpleMaterialPhysicallyBasedMaterialUnlitMaterial 来生成我们一直在使用的所有这五种着色器习惯了。

让我们看看它的样子:

SCNMaterial.LightingModel.blinn           – SimpleMaterial(color: . gray,
                                                        roughness: .float(0.5),
                                                       isMetallic: false)

SCNMaterial.LightingModel.lambert         – SimpleMaterial(color: . gray,
                                                        roughness: .float(1.0),
                                                       isMetallic: false)
  
SCNMaterial.LightingModel.phong           – SimpleMaterial(color: . gray,
                                                        roughness: .float(0.0),
                                                       isMetallic: false)

SCNMaterial.LightingModel.physicallyBased – PhysicallyBasedMaterial()


SCNMaterial.LightingModel.constant        – UnlitMaterial(color: .gray)