7

i'm trying to load downloaded 3d objects from documents directory. i've successfully loaded 3d object file and .mtl file in scenekit but images that are named inside .mtl file are not renderd to apply texture on 3d model which are also placed inside documents directory with same name as in .mtl file.

below is the code used

func loadObjToScene() {
    let scene = SCNScene()

    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    scene.rootNode.addChildNode(cameraNode)

    cameraNode.position = SCNVector3.init(0, 0, 15)

    // create and add a light to the scene
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light?.type = .omni
    lightNode.position = SCNVector3.init(0, 0, 10)
    scene.rootNode.addChildNode(lightNode)

    // create and add an ambient light to the scene
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light?.type = .ambient
    ambientLightNode.light?.color = UIColor.darkGray
    scene.rootNode.addChildNode(ambientLightNode)


    scnView.scene = scene
    scnView.allowsCameraControl = true
    scnView.showsStatistics = false
    scnView.backgroundColor = UIColor.white


    let mdlAsset = MDLAsset(url: URL(fileURLWithPath: "\(MZUtility.baseFilePath)/\(/obj?.objectUrl?.fileName)"))


    let scatteringFunction = MDLScatteringFunction.init()
    let material = MDLMaterial.init(name: "baseMaterial", scatteringFunction: scatteringFunction)


    let textureFileName = "Ford_Explorer_(Mk5f)_(U502)_Police_Interceptor_Utility_HQinterior_2016.mtl"

    material.setTextureProperties(textures: [MDLMaterialSemantic.baseColor : textureFileName])

    for mesh in ((mdlAsset.object(at: 0) as? MDLMesh)?.submeshes as? [MDLSubmesh]) ?? [] {
      print("Mesh Name: \(mesh.name)")
      mesh.material = material
    }






    mdlAsset.loadTextures()




    let objectNode = SCNNode(mdlObject: mdlAsset.object(at: 0))
    objectNode.scale = SCNVector3(2, 2, 2)
    objectNode.position = SCNVector3(0, 0, 0)

    scene.rootNode.addChildNode(objectNode)
  }

}


extension MDLMaterial {
  func setTextureProperties(textures: [MDLMaterialSemantic:String]) -> Void {
    for (key,value) in textures {
      let url = URL(fileURLWithPath: "\(MZUtility.baseFilePath)/\(value)")
      let property = MDLMaterialProperty(name:value, semantic: key, url: url)
      self.setProperty(property)
    }
  }
}
Sand'sHell811
  • 358
  • 3
  • 15
  • 1
    Did you checked if setTextureProperties finds proper url ? or those are just empty. Place the desired resources i bundle and test with something like for (key,value) in textures { guard let url = Bundle.main.url(forResource: value, withExtension: "") else { fatalError("Failed to find URL for resource \(value).") } let property = MDLMaterialProperty(name:value, semantic: key, url: url) see also https://github.com/nauman-tintash/ARKitObjectPlacementDemo/ – ares777 Jun 19 '19 at 14:16
  • @user3344236 is there any way to read .mtl files to set MDLMaterialProperty dynamically – Sand'sHell811 Jun 21 '19 at 08:04

0 Answers0