如何通过SceneKit和Model I / O在.OBJ 3d模型上应用.MTL文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过SceneKit和Model I / O在.OBJ 3d模型上应用.MTL文件相关的知识,希望对你有一定的参考价值。

我试图通过SceneKit和Model I / 0在.obj 3d模型上应用.mtl文件纹理。

当我尝试在其上应用纹理的.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)

我正在为setTextureProperties使用以下MDMaterial扩展:

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文件中获取纹理数据?

答案

可能有点晚了,但我面临同样的问题,我可以加载.mtl信息的方式是通过和场景创建对象,例如,我正在加载this model

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

确保包含纹理的.mtl和jpg。

Rose loaded from scene rootnode

以上是关于如何通过SceneKit和Model I / O在.OBJ 3d模型上应用.MTL文件的主要内容,如果未能解决你的问题,请参考以下文章

来自自定义数据的模型 I/O 网格

SceneKit:如何从Google Poly为同一个OBJ文件重新创建照明?

如何通过使用不同的类来切换 SceneKit 视图

Overlapped Model

Scenekit:如何获取节点的所有材质?

iOS 将 .obj 文件导入模型 I/O 而不复制顶点