gpt4 book ai didi

ios - 如何将 mtl 纹理文件应用到 OBJ

转载 作者:行者123 更新时间:2023-12-05 07:34:17 27 4
gpt4 key购买 nike

我正在使用 ModelI/O 来展示 3D 模型。这是我的代码:

// Load the .OBJ file
guard let url = Bundle.main.url(forResource: "agera r", withExtension: "obj") else {
fatalError("Failed to find model file.")
}

let asset = MDLAsset(url:url)
guard let object = asset.object(at: 0) as? MDLMesh else {
fatalError("Failed to get mesh from asset.")
}

// Create a material from the various textures
let scatteringFunction = MDLScatteringFunction()
let material = MDLMaterial(name: "baseMaterial", scatteringFunction: scatteringFunction)
let textureFileName = "agera_r.mtl"
material.setTextureProperties([.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)
let scene = SCNScene()
scene.rootNode.addChildNode(node)

// Set up the SceneView
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
sceneView.scene = scene
sceneView.backgroundColor = UIColor.black
}
extension MDLMaterial {
func setTextureProperties(_ textures: [MDLMaterialSemantic:String]) -> Void {
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)
self.setProperty(property)
}
}

问题是当应用程序运行时,会显示 3D 模型,但 .mtl 纹理文件不适用于它。如何解决这个问题?谢谢大家。

最佳答案

这行的主要问题:

let textureFileName = "agera_r.mtl"
material.setTextureProperties([.baseColor: textureFileName])

您应该将 URL 传递给纹理文件而不是 .mtl 文件 URL。这段代码对我来说很好用:

objective-C

MDLScatteringFunction *scatFunction = [MDLScatteringFunction new];
MDLMaterial *mdlMaterial = [[MDLMaterial alloc] initWithName:@"material" scatteringFunction:scatFunction];
MDLMaterialProperty *bcProperty = [[MDLMaterialProperty alloc] initWithName:@"BaseColor" semantic:MDLMaterialSemanticBaseColor URL:textureFileURL];
[mdlMaterial setProperty:bcProperty];
SCNMaterial *material = [SCNMaterial materialWithMDLMaterial:mdlMaterial];
node.geometry.firstMaterial = material;

SWIFT

let scatFunction = MDLScatteringFunction()
let material = MDLMaterial(name: "material", scatteringFunction: scatFunction)
material.setTextureProperties(textures: [.baseColor: "model/texture.png"])
mesh.submeshes?.forEach {
if let submesh = $0 as? MDLSubmesh {
submesh.material = material
}
}

baseNode = SCNNode(mdlObject: mesh)

附言这是该任务的两种略有不同的方法。

更新:

let baseNode = SCNScene(named: "mesh.obj")!.rootNode

您也可以尝试使用这种方法。如果我没记错的话,它会连接 .mtl 文件和其他纹理。 (如果 .obj 文件中写入的 .mtl 文件的路径有效,并且 .mtl 中的纹理路径也有效)

关于ios - 如何将 mtl 纹理文件应用到 OBJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50241414/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com