2016-12-09 72 views
9

SceneKit & Model I/0 üzerinden .obj 3B modelinde bir .mtl dosyası doku uygulamak çalışıyorum..MTL Dosyası Nasıl Uygulanır .OBJ 3d Model, SceneKit ve Model I/O aracılığıyla

Bunun üzerine bir doku .jpg uygulamaya çalıştığınızda Kodum aşağıda çalışıyor: Ben yüklenmesi gereken Nasıl

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) 
    } 
    } 
} 

: Ben setTextureProperties için aşağıdaki MDMaterial uzantısını kullanıyorum

 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) 

bir .mtl dosyası ve üzerinde dokuya sahip olmak için modelimin üzerine uygulayabilir miyim? SCNMaterial'ın .mtl dosyasından doku verileri aldığını bildirmek için hangi özellikleri belirtmeliyim?

Geç biraz olabilir, ama ben aynı sorunu ben .mtl bilgileri yükleyebilir şeklini karşı karşıyayım
+1

Aynı sorularım var. Sorunu çözdün mü? – HaoDong

+0

Hayır, maalesef değil. Sadece .jpg doku haritalaması ile bir çözüm yollamak zorunda kaldım. –

+0

Sadece .jpg dosyalarıyla nasıl yaptığınıza dair kodu gösterebilir misiniz? – humbleCoder

cevap

1

örneğin, ben yükleme ediyorum, içinden ve sahne nesnesi yaratmaktı this model

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

.mtl ve Paketinizdeki dokuları ile jpg olduğundan emin olun.

Rose loaded from scene rootnode