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

时间:2017-03-30 15:39:58

标签: three.js

使用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 个答案:

答案 0 :(得分:1)

我认为主要问题是当前编写的objloader需要手头有材料来了解加载obj文件时要应用的材料。

将mtl文件应用于现有网格非常重要。

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

结论是objloader并不准备或支持您想要做的事情。但由于它是开源的并且接受pull reqs,你可以写一个你自己的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两次,但是我们可以假设第二次加载它在浏览器ram中缓存并且应该只需几毫秒。

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

所有这一切,知道mtl规范,obj文件使用多个MTL文件似乎相当愚蠢,除非MTL在许多obj文件中共享。