Comment L'Appliquer.MTL File on.Modèle OBJ 3d via SceneKit & Model I / O

j'essaie d'appliquer un .la texture du fichier mtl est activée .obj modèle 3d via SceneKit Et le Modèle I/0.

mon code ci-dessous fonctionne très bien quand j'essaie de postuler .jpg d'une texture sur:

       let url = NSBundle.mainBundle().URLForResource("chair", withExtension: "obj")            
       let asset = MDLAsset(URL: NSURL(string:url)!)
        guard let object = asset.objectAtIndex(0) as? MDLMesh else {
            //fatalError("Failed to get mesh from asset.")
            return
        }

        if shouldApplyTexture == true {
            var textureFileName = "chair.mtl"

            // Create a material from the various textures
            let scatteringFunction = MDLScatteringFunction()
            let material = MDLMaterial(name: "baseMaterial", scatteringFunction: scatteringFunction)

            material.setTextureProperties(textures: [
                                            .BaseColor:textureFileName])

            // Apply the texture to every submesh of the asset
            for  submesh in object.submeshes!  {
                if let submesh = submesh as? MDLSubmesh {
                    submesh.material = material
                }
            }

        }

        // Wrap the ModelIO object in a SceneKit object
        let node = SCNNode(MDLObject: object)

        if (scene.rootNode.childNodes.count > 0){
            scene.rootNode.enumerateChildNodesUsingBlock { (node, stop) -> Void in
                node.removeFromParentNode()
            }
        }
        scene.rootNode.addChildNode(node)

j'utilise L'extension MDMaterial suivante pour setTextureProperties:

extension MDLMaterial {
func setTextureProperties([MDLMaterialSemantic:String]) -> Void {

    for (key,value) in textures {
        var finalURL = NSBundle.mainBundle().URLForResource(value, withExtension: "")
       guard let url = finalURL else {
           // fatalError("Failed to find URL for resource (value).")
            return
        }

        let property = MDLMaterialProperty(name:fileName!, semantic: key, URL: url)
        self.setProperty(property)
    }
  }
}

Comment dois-je charger un .fichier mtl et de l'appliquer sur mon modèle, texture? Quelles propriétés de SCNMaterial devrais-je déclarer pour obtenir des données de texture à partir d'un .fichier mtl?

11
demandé sur n.by.n 2016-12-09 13:00:19

1 réponses

Il serait peut-être un peu tard, mais je suis confrontée au même problème et la façon dont je pourrais charger le .mtl information était de créer l'objet et de la scène, par exemple, je suis de chargement ce modèle

let scene = SCNScene(named: "rose.obj")

assurez-vous d'avoir le .mtl et le jpg avec les textures dans votre paquet.

Rose loaded from scene rootnode

1
répondu Barbara Rodeker 2018-05-03 12:45:29