RealityKit – 以编程方式向 ModelEntity 添加材质

iic*_*ain 4 augmented-reality swift arkit realitykit reality-composer

RealityKit 的文档包括 structs: OcclusionMaterial, SimpleMaterial, 和UnlitMaterial用于将材料添加到ModelEntity.

或者,您可以加载一个带有材料的模型。

我想以ModelEntity编程方式向 a 添加自定义材料/纹理。如何在不将材质添加到 Reality Composer 或其他一些 3D 软件中的模型的情况下即时实现这一点?

ARG*_*Geo 8

更新时间:2021 年 6 月 8 日

RealityKit 2.0 和 RealityFoundation 目前有 6 种材质

因此,您可以在SimpleMaterial()类中使用以下代码:

@IBOutlet var arView: ARView!

let sceneObjects = try! Experience.loadAllMyObjects()

var simpleMaterial = SimpleMaterial()
    
simpleMaterial.baseColor = try! MaterialColorParameter.texture(
                                          TextureResource.load(named: "img.jpg"))

simpleMaterial.metallic = MaterialScalarParameter(floatLiteral: 0.9)
simpleMaterial.roughness = MaterialScalarParameter(floatLiteral: 0.1)
simpleMaterial.tintColor = UIColor.yellow

/*

simpleMaterial.baseColor = MaterialColorParameter.color(UIColor(red: 0.7,
                                                              green: 0.5,
                                                               blue: 0.2,
                                                              alpha: 1.0))
*/
Run Code Online (Sandbox Code Playgroud)

目前 RealityKit 2.0 中有 5 种方法来创建 3D 基元:

  • generateBox(...)
  • generateSphere(...)
  • generatePlane(...)
  • generateText(...)
  • generate(...) – 从网格描述符列表中创建网格资源

所以让我们使用其中之一:

let mesh: MeshResource = .generateBox(size: 2.5)

let component = ModelComponent(mesh: mesh, 
                          materials: [simpleMaterial])

sceneObjects.components.set(component)
arView.scene.anchors.append(sceneObjects)
Run Code Online (Sandbox Code Playgroud)


如何在 RealityKit 中生成 SceneKit 的着色器

我们知道在 SceneKit 中有 5 种不同的着色模型,因此我们可以使用 RealityKit 的SimpleMaterial,PhysicallyBasedMaterialUnlitMaterial生成我们已经习惯的所有这五种着色器。

让我们看看它的样子:

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

  • 它确实有效,是的。使 alpha 通道正常工作似乎依赖于目前的解决方法:[Apple 论坛](https://forums.developer.apple.com/thread/119265) (2认同)