RealityKit - добавление материала в ModelEntity программным способом

Документация для RealityKit включает структуры: OcclusionMaterial, SimpleMaterial и UnlitMaterial для добавления материалов в ModelEntity.

В качестве альтернативы вы можете загрузить модель с прикрепленным к ней материалом.

Я хочу программно добавить пользовательский материал / текстуру в ModelEntity. Как я могу добиться этого на лету, не добавляя материал к модели в Reality Composer или другом программном обеспечении для 3D?


person iicaptain    schedule 30.06.2019    source источник


Ответы (1)


Обновлено: 8 июня 2021 г..

На данный момент в 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))
*/

И на данный момент в 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)


Как сгенерировать шейдеры SceneKit в RealityKit

Мы знаем, что в SceneKit есть 5 различных моделей затенения, поэтому мы можем использовать SimpleMaterial, PhysicallyBasedMaterial и UnlitMaterial RealityKit для генерации всех этих пяти шейдеров, к которым мы привыкли.

Посмотрим, как это выглядит:

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)
person Andy Fedoroff    schedule 02.07.2019
comment
Я могу подтвердить, что это отлично работает в iOS 13! Спасибо @ARGeo - person iicaptain; 03.07.2019
comment
Да, работает. На данный момент для работы альфа-канала требуется обходной путь: форумы Apple - person HelloTimo; 17.09.2019
comment
Есть ли способ добавить в бокс 6х текстур лица? - person Jayden Irwin; 10.06.2021
comment
@JaydenIrwin, конечно, выход есть. Вы должны сделать это в редакторе UV-текстур в любом приложении для создания 3D (например, Maya, Max или Blender). - person Andy Fedoroff; 10.06.2021
comment
Да, я не знаю, как пользоваться программным обеспечением для 3D. Я надеялся, что есть простой способ сделать это в коде. Подобно SceneKit, он может принимать массив из 6 текстур для нанесения на каждую грань коробки. - person Jayden Irwin; 10.06.2021
comment
Я на 100% уверен, что можно использовать CustomMaterial (со скриптами Metal), но я думаю, что более простой способ - это UV-сопоставление текстуры в 3D-программах)))) Подготовка текстур с UV-отображением в 3D-приложениях - это распространенный способ работа с 3D моделями. Это верно для Unity, Unreal, SceneKit, RealityKit и т. Д. - person Andy Fedoroff; 10.06.2021