C#中如何加载同目录下同名MTL文件的OBJ模型
解决OBJ模型加载后MTL纹理不显示的问题
我来帮你搞定这个纹理加载的问题!你已经成功加载OBJ模型了,说明基础的模型导入逻辑没问题,主要是MTL文件里的纹理路径解析出了小状况,咱们一步步来调整:
核心问题原因
默认的ModelImporter在处理MTL文件时,可能无法正确解析纹理的相对路径——尤其是当纹理和OBJ/MTL文件同目录,或者在子目录里的时候,它不知道该去哪里找这些纹理文件。
修改后的代码实现
你只需要给ModelImporter添加一个TextureFileNameResolver委托,用来指定纹理文件的正确路径。修改后的代码如下:
if (result == true) { string filename = dlg.FileName; obj_name.Text = filename; // 获取OBJ文件所在的目录,用来拼接纹理路径 string objDirectory = Path.GetDirectoryName(filename); ModelImporter import = new ModelImporter(); // 设置纹理路径解析器,处理MTL中的相对路径 import.TextureFileNameResolver = (mtlFileName, textureFileName) => { // 将MTL里的纹理文件名和OBJ所在目录拼接成完整路径 return Path.Combine(objDirectory, textureFileName); }; Model3DGroup model1 = import.Load(filename); model.Content = model1; }
额外检查事项
除了代码调整,还有几个细节要确认:
- 确保MTL文件和OBJ文件在同一个目录下,并且MTL文件名和OBJ文件名完全一致(比如
model.obj对应model.mtl)。 - 检查MTL文件里的纹理路径是否正确:比如MTL里写的是
map_Kd texture.png,那texture.png必须确实在OBJ所在的目录(或者你指定的路径里),文件名和扩展名不能写错,注意大小写(虽然Windows不敏感,但最好保持一致)。 - 确认纹理格式是WPF支持的类型:比如PNG、JPG、BMP这些都没问题,一些特殊格式(比如TGA)可能需要额外的处理库。
内容的提问来源于stack exchange,提问作者user8833018
相关产品推荐
相关产品推荐

