Question or problem with Swift language programming:
I am trying to apply an .mtl file texture on .obj 3d model via SceneKit & Model I/0.
My code below works fine when I try to apply .jpg of a texture on it:
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)
I am using the following MDMaterial extension for 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) } } }
How should I load an .mtl file and apply it on my model to have texture on it?
What properties of SCNMaterial should I declare for getting texture data from a .mtl file?
How to solve the problem:
Solution 1:
It might be a bit late, but I’m facing the same issue and the way in which I could load the .mtl information was to create the object through and scene, for example, I’m loading this model
let scene = SCNScene(named: "rose.obj")
Make sure to have the .mtl and the jpg with the textures in your bundle.