Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 是否有方法使用obj文件中的路径加载mtl?_Three.js - Fatal编程技术网

Three.js 是否有方法使用obj文件中的路径加载mtl?

Three.js 是否有方法使用obj文件中的路径加载mtl?,three.js,Three.js,使用three.js ObjLoader的示例还使用MTLLoader,该MTLLoader提供了mtl文件的单独路径 但是,obj文件包括如下mtl文件路径: mtllib mymaterial.mtl 我是IIIF社区的一部分,要求IIIF清单中包含的资源有一个描述您所需一切的路径。有没有使用obj文件加载网格和材质的示例?我认为主要问题是,当前编写的obj加载程序需要手头有材质,以便知道加载obj文件时应用哪些材质 将mtl文件应用于现有网格并非易事 另一个警告是,我似乎找不到objl

使用three.js ObjLoader的示例还使用MTLLoader,该MTLLoader提供了mtl文件的单独路径

但是,obj文件包括如下mtl文件路径:

mtllib mymaterial.mtl

我是IIIF社区的一部分,要求IIIF清单中包含的资源有一个描述您所需一切的路径。有没有使用obj文件加载网格和材质的示例?

我认为主要问题是,当前编写的obj加载程序需要手头有材质,以便知道加载obj文件时应用哪些材质

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

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

结论是objloader的现状并没有准备好或支持您想要做的事情。但由于它是开源的,并且接受pull-req,因此您可以编写自己的objloader。如果你在谷歌上搜索,你会发现有一个名为objmtloader.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文件之间共享,这似乎相当愚蠢