有没有办法使用 obj 文件中的路径加载 mtl?

Posted

技术标签:

【中文标题】有没有办法使用 obj 文件中的路径加载 mtl?【英文标题】:Is there a way to load a mtl using the path in the obj file? 【发布时间】:2017-03-30 15:39:58 【问题描述】:

使用three.js ObjLoader 的示例还使用了MTLLoader,它被赋予了mtl 文件的单独路径。

https://github.com/mrdoob/three.js/blob/master/examples/webgl_loader_obj_mtl.html#L91

但是,obj 文件包含这样的 mtl 文件路径:

mtllib mymaterial.mtl

我是 IIIF 社区的一员,并且要求 IIIF 清单中包含的资源具有描述您需要的所有内容的单一路径。有没有使用 obj 文件加载网格材质的示例?

【问题讨论】:

【参考方案1】:

我认为主要问题是当前编写的 objloader 需要手头有材料才能知道在加载 obj 文件时要应用哪些材料。

将 mtl 文件应用于现有网格并非易事。

另一个警告是,我似乎找不到任何 objloader 支持多个 mtl 文件的地方。

结论是 objloader 尚未准备好或不支持您想要执行的操作。但由于它是开源的并接受拉取请求,因此您可能会编写自己的 objloader。如果你谷歌你会发现有一个名为 objmtlloader.js 的尝试。但显然它是有问题的并被删除。

如果您对每个 obj 一个 mtllib 没问题,但又不想编写代码,则可以使用以下模式:

            var loader = new THREE.OBJLoader( manager );
            var objpath = 'path/to/your/object.obj';

            loader.load( objpath, function ( object ) 
                loadMats(object, objpath);
            ,
            function(eve)console.log("obj progress", eve),
            function(xhr)console.log("obj error", e)
            );
            var loadMats = function(obj, objpath)
                imgloader = new THREE.MTLLoader(manager);
                imgloader.setPath(objpath.substring(0, objpath.lastIndexOf("/")+1));
                imgloader.load( obj.materialLibraries[0],
                    function(materials)
                        var objLoader = new THREE.OBJLoader(manager);
                        objLoader.setMaterials(materials);
                        objLoader.load(objpath, function(object) 
                                scene.add(object);
                            ,
                            function(eve)console.log("obj progress", eve),
                            function(xhr)console.log("obj error", e)
                        );
                    ,
                    function(eve)console.log("mtl progress", eve),
                    function(xhr)console.log("mtl error", e)
                );
            

此模式加载 obj,允许它发现材质文件名,然后加载它们。这种模式是有问题的,因为它必须加载 obj 两次,但我们可以假设第二次加载它缓存在浏览器内存中并且应该只需要几毫秒。

这是一个废话的答案,也许有人可以纠正我,但由于没有人回答,我会说这就是我将如何处理从 mtllib 行中获取 mtl 文件,并努力提供更好的支持。

说了这么多,知道 mtl 规范,除非 MTL 在许多 obj 文件之间共享,否则 obj 文件将使用多个 MTL 文件似乎很愚蠢。

【讨论】:

以上是关于有没有办法使用 obj 文件中的路径加载 mtl?的主要内容,如果未能解决你的问题,请参考以下文章

PyOpenGL - 如何加载在 mtl 文件中定义了颜色的 obj 文件

WebGL入门(四十三)-WebGL加载OBJ-MTL三维模型

three.js obj 和 mtl 文件用阴影呈现黑色

如何导入 3D 场景(.obj 文件和 .mtl 文件)

实现在3D模型上加载2D图片,3D模型用obj+mtl格式的文件实现的

Android OpenGLES2.0(十六)——3D模型贴图及光照处理(obj+mtl)