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

标签 ios swift 3d scenekit modelio

我正在尝试通过 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 文件并将其应用到我的模型上以获得纹理? 要从 .mtl 文件获取纹理数据,我应该声明 SCNMaterial 的哪些属性?

最佳答案

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

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

确保在您的包中包含带有纹理的 .mtl 和 jpg。

Rose loaded from scene rootnode

关于ios - 如何通过 SceneKit 和模型 I/O 在 .OBJ 3d 模型上应用 .MTL 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41057710/

相关文章:

ios - UITableView不会显示数据

ios - 以编程方式删除 UIBarButtonItem 的图像

java - 旋转平面,使其法线与另一个平面的法线方向相同

python - Python 中的 3D 几何相交

ios - Primary/Master - 具有多个级别的 TableView

ios - 更改委托(delegate)方法的参数类型

ios - CGFontCreateWithDataProvider 在飞行模式下挂起

ios - "Calendar.current.isDate"日期参数是否需要使用同一时区的日期?

swift - Swift 中的 ^ 运算符

html - 使用 CSS 3D 变换点击区域中断