在Scenekit中使用.obj从文档目录中加载.mtl文件以获取纹理

时间:2019-06-10 06:42:15

标签: swift xcode 3d scenekit arkit

我正在尝试从文档目录加载下载的3d对象。 我已经成功地在Scenekit中加载了3d对象文件和.mtl文件,但是在.mtl文件中命名的图像无法渲染以在3d模型上应用纹理,这些图像也以与.mtl文件相同的名称放置在文档目录中。

下面是使用的代码

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

0 个答案:

没有答案