首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法使用obj文件中的路径加载mtl?

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

Stack Overflow用户
提问于 2017-03-30 15:39:58
回答 1查看 1.5K关注 0票数 0

使用three.js ObjLoader的示例还使用MTLLoader,它为mtl文件提供了一个单独的路径。

mtl.html#L91

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

代码语言:javascript
复制
mtllib mymaterial.mtl

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

EN

回答 1

Stack Overflow用户

发布于 2017-03-31 14:41:48

我认为主要的问题是,当前编写的objloader需要有一些材料,以便知道加载obj文件时要应用什么材料。

将mtl文件应用于现有网格是不容易的.

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

结论是,现在的objloader还没有准备好或支持您想要做的事情。但是,由于它是开源的,并且接受拉reqs,所以您可能会编写自己的obj加载器。如果你在谷歌上搜索,你会发现有一个名为objmtlloader.js的尝试。但很明显,它是有问题的,而且被删除了。

但是,如果您对每个obj有一个mtllib表示满意,并且不想编写代码,则可以使用以下模式:

代码语言:javascript
复制
            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规范,一个obj文件将使用多个MTL文件似乎相当愚蠢,除非MTL在多个obj文件之间共享。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43122400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档