如何在RealityKit中以编程方式向ModelEntity添加材料?

ia2d9nvy  于 2022-09-19  发布在  Swift
关注(0)|答案(1)|浏览(136)

RealityKit的文档包括用于向ModelEntity添加材料的结构:OcclusionMaterialSimpleMaterialUnlitMaterial

或者,也可以载入附着了材质的模型。

我想以编程方式向ModelEntity添加自定义材质/纹理。如果不将材质添加到Reality Composer或其他3D软件中的模型中,我如何在运行中实现这一点?

vs91vp4v

vs91vp4v1#

更新日期:2022年6月14日

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)
    }
}

阅读这篇文章,了解如何为RealityKit的着色器加载纹理。

如何创建类似于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()

// all three shaders (`.constant`, `UnlitMaterial` and `VideoMaterial `) 
// don't depend on lighting
SCNMaterial.LightingModel.constant        – UnlitMaterial(color: .gray)
                                          – VideoMaterial(avPlayer: avPlayer)

相关问题