2016-12-09 9 views
9

SceneKit & 모델 I/0을 통해 .obj 3D 모델에 .mtl 파일 텍스처를 적용하려고합니다.SceneKit 및 모델 I/O를 통해 .OBJ 3D 모델의 .MTL 파일을 적용하는 방법

나는 그것에 텍스처의 .JPG를 적용하려고하면 내 아래 코드는 잘 작동 : 나는로드해야합니다 어떻게

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

: I setTextureProperties에 대해 다음 MDMaterial 확장자를 사용하고

 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) 

을 .mtl 파일을 만들고 내 모델에 텍스처를 적용 해 보겠습니다. .mtl 파일에서 텍스처 데이터를 가져 오기 위해 SCNMaterial의 속성을 선언해야합니까?

그것은 조금 늦게 될 수도 있지만 나는이 같은 문제와 나는 .mtl 정보를로드 할 수있는 방향을 향하고있어
+1

나는 동일한 질문을 가지고있다. 문제를 해결 했습니까? – HaoDong

+0

아니요, 불행히도 아닙니다. .jpg 텍스처 매핑만으로 솔루션을 제공해야했습니다. –

+0

.jpg 파일 만 사용하여 코드를 표시 할 수 있습니까? – humbleCoder

답변

1

예를 들어, 내가로드 있어요 통해 현장 객체를 만드는 것이었다 this model

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

하면 .mtl과 번들의 텍스처와 JPG를해야합니다.

Rose loaded from scene rootnode