RealityKit Изменить диффузный материал USDZ во время выполнения

Я загружаю модель USDZ с помощью RealityKit в Swift. Модель отлично загружается своей текстурой.

Однако я не могу изменить диффузное свойство материала, материал всегда возвращается как AnyMaterial.

Я могу полностью переопределить материал с помощью SimpleMaterial или изменить диффузный цвет USDZ перед запуском приложения, но, похоже, не могу сделать это во время выполнения, есть идеи?

Я просто хочу изменить одно свойство

/*
Find an entity within the parent, and find the material, test to try and change it's material
**/
private func updateColor(entity: Entity) {

    guard
        let found = entity.findEntity(named: "MyItem"),
        var modelComponent = found.components[ModelComponent] as? ModelComponent,
        let existingMaterial = modelComponent.materials.first else {
        return
    }

    // This is `AnyMaterial` - no diffuse property
    // What can I use here to change the diffuse?
    modelComponent.materials = [existingMaterial]

    // Change to yellow for testing
    //var material = SimpleMaterial()
    //material.baseColor = .color(.yellow)
    //modelComponent.materials = [material]

    found.components.set(modelComponent)
}

person Chris    schedule 14.06.2020    source источник
comment
Я обновил свой ответ.   -  person Andy Fedoroff    schedule 28.06.2020


Ответы (1)


В RealityKit 1.0 вы можете изменять материал во время выполнения, но не можете анимировать его параметры.

Вот код:

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let modelAnchor = try! Experience.loadBox()

        modelAnchor.steelBox!.scale = [10,10,10]
        let entity: Entity = modelAnchor.steelBox!.children[0]
        arView.scene.anchors.append(modelAnchor)
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {

            var material = SimpleMaterial()
            material.baseColor = try! .texture(.load(named: "texture.jpg"))
            
            var component: ModelComponent = entity.components[ModelComponent]!.self   
            component.materials = [material]
            entity.components.set(component)
        }
    }
}


В RealityKit 2.0 для iOS 15 вы можете настроить цвет и текстуру материала немного по-другому:

var material = SimpleMaterial()

material.color =  .init(tint: .green, texture: nil)
person Andy Fedoroff    schedule 14.06.2020