2016-12-09 13 views
9

Я пытаюсь применить текстуру .mtl-файла для 3D-модели .obj через SceneKit & Модель I/0.Как применить файл .MTL на .OBJ 3d-модели с помощью SceneKit и Model I/O

Мой код ниже отлично работает, когда я пытаюсь применить .jpg текстуры на нем:

 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) 

Я использую следующий MDMaterial расширение для 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) 
    } 
    } 
} 

Как я должен загрузить файл .mtl и применить его на моей модели, чтобы иметь текстуру на нем? Какие свойства SCNMaterial я должен объявить для получения данных текстуры из файла .mtl?

+1

У меня такой же вопрос. Вы решили свою проблему? – HaoDong

+0

Нет, к сожалению, нет. Я должен был отправить решение только с .jpg картированием текстур. –

+0

Не могли бы вы показать код о том, как вы сделали это с помощью только файлов .jpg? – humbleCoder

ответ

1

Это может быть немного поздно, но я столкнулся с таким же вопросом и способом, которым я мог загрузить .mtl информации был создать объект через и сцены, например, я загружаю this model

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

Убедитесь, что есть .mtl и JPG с текстурами в вашем пачке.

Rose loaded from scene rootnode