如何访问OBJMTLLoader加载的OBJ的不同部分?

时间:2015-09-25 11:09:05

标签: javascript three.js mesh dat.gui

我用3DS Max制作了一个建筑物的模型,其中每个房间都是一个修改过的立方体,我使用OBJMTLLoader用他自己的MTL加载OBJ文件。 问题是我需要根据用户要求强调某些房间。

我使用dat.gui来显示一个菜单,用户可以在其中选中/取消选中房间以便对它们进行评论(我想我会更改房间大小或者是为了强调房间大小)。

这是我的装载机的代码

var loader = new THREE.OBJMTLLoader();
        loader.load( 'models/ed.obj', 'models/textures/ed.mtl', 

        //onLoad()
        function ( object ){
            contenido = object;
            contenido.position.set(0,0,0);
            contenido.position.y = -80;
            contenido.name = 'edificio';

            scene.add(contenido);

            return contenido;
        } //and other onLoad, and onError stuff

我可以使用整个模型,我有一个透明度函数,可以调整dat.gui栏的透明度(名为opciones.Opacidad的那个)

contenido.traverse( function( object ) {

                    if( object.material ) {

                        object.material.opacity = opciones.Opacidad;
                        object.material.transparent = true;
                    }

它工作正常,但当我尝试访问几何体的内部多维数据集以在线框中标记它们时(例如)我使用:

contenido.getObjectByName("RoomNameIn3DSMax").material.wireframe=true;

为了在线框中查找并显示它,因为OBJ文件使用其3DS Max名称命名每个模块。但它不起作用,看起来找到该项是因为我没有得到任何错误,但它没有出现在线框中,当我使用另一个房间名称时,有时程序在线框中显示很多可以包含的内容请求的一个或者没有,另一个发现“未定义”我认为它与OBJMTLLoader创建的组有关。

我也试过

        contenido.traverse( function ( child ) {
            if ( child.name == "NameInOBJor3DSMax" ) {
                child.material.wireframe = true;
            }
        })

但结果是一样的。

所以我的问题是,如何访问加载OBJMTLLoader的模型内部模块?正如您所看到的,我尝试使用“Object3D”方法来访问整个模型的内部多维数据集,我是否正确地进行了操作?如果需要,我可以提供所有代码和文件,你可以在这里看到我的问题的方法:

3DBuilding link 您还可以在那里看到所有代码;)

感谢您的关注,希望有人能帮助我。

编辑:当我这样做时:

 scene.getObjectByName("nameOfModule").material.color.set(0xff0000); 

用红色或只是注释:.material.wireframe = true;它显示了许多未被实现的事情。当我使用scene.getObjectById(ObjectId,true)时它也会这样做;但它没有在DOM树中显示对象的名称。

我正在尝试使用其他导出工具来查看问题是否只是OBJ Exporter。这真令人讨厌。

以下是该问题的一些屏幕。

我试着说: What I try to tint

如您所见,它只是一个经过编辑的框

注意到的是什么: What is tinted

如果我们转到OBJ文件,我们可以看到类似这样的内容:

#
  # object SDHAE001
#

v  106.4733 84.7697 -94.9228
... (more vertices)
v  106.3747 76.8453 -96.3784
# 16 vertices

vn 0.0000 1.0000 -0.0000
...(more normals)
vn -0.9991 0.0046 0.0425
# 14 vertex normals

#and here the group of faces fot that object ( Using triangles )
g SDHAE001
usemtl wire_115115115
f 10663//5549 10664//5549 10665//5549 
...(more triangle faces)
f 10676//5559 10663//5561 10678//5562 
# 22 faces

正如你所看到的,3DS Max正在为我的几何创建多边形组,据我所知,OBJMTL忽略了“g”组,所以当我试着说一些东西时,它会说很多东西......尝试与其他出口商...手动解析OBJ文件会很烦人......

再次编辑

我一直在探索这些选项,并且3DJ MAX生成OBJ,但是当我探索de DOM Tree时,我可以看到THREE.Mesh作为一个数组,其中只有一些对索引具有预期的对象有了他自己的名字,奇怪的索引有某种几何形状我无法控制而没有指定任何名称,并且由于一些奇怪的原因,在几何实例中创建了一些没有意义的“顶点”组,我上传了一些屏幕和OBJ / MTL文件让我的问题更加清晰:

看看这个,我将尝试现在评论一个名为“Conserjeria”的模块。这是位于DOM树中的模块:

Mesh located

Bigger image

这里,在第一列我们可以看到,第一个问题,我的OBJ(所有几何体)文件只有大约298个对象,所以为什么有1056个网格对象?它不是很相关,因为大多数都是空名。

第二个问题,在第二列你可以看到“Conserjeria”房间的几何属性,我想这里是产生问题的地方...... 在第三列,我向你展示了我的“Conserjeria”对象的奇怪的“顶点”数组。我说很奇怪,因为它由6272个索引组成...我的OBJ文件中的 NOTHING 有6272个顶点...你可以看到OBJ here,你可以找到 Conserjeria 如果你想看到它的结构(52v,11vn,80f)。这可能是为什么当我试着只注意某些物体时,它会说很多它们?

我也尝试过使用 3盒的简化模型,其中2个被正确评论,但第一个不是,看看(使用复选框来标注它们)我可以想象一下为什么会这样。 (当场景中只有3个立方体时,阵列中还有7个THREE.MESH索引...)

TestingCubes

任何帮助只能说我的房间?如果需要,我可以分享我拥有的一切(代码,OBJ,MTL,3ds ......)

感谢所有想帮助我的人。

1 个答案:

答案 0 :(得分:0)

看起来网格名称有问题。

当我执行以下脚本时,它的工作正常:

scene.children[2].traverse(function(c) {
  if(c.material && c.name.indexOf("INVESTIGACION_1_") >= 0) {
    c.material.color.set(0xff0000) 
  }
})

正如预期的那样,将模型的一部分染成红色。