2

我用 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 链接 您还可以在那里查看所有代码;)

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

编辑:当我这样做时:

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

将其标记为红色或仅: .material.wireframe=true; 它显示了许多未发生的事情。当我使用 scene.getObjectById(ObjectId, true); 时也是如此 但它不会在 DOM 树中显示对象的名称。

我正在尝试使用其他导出工具来查看问题是否只是 OBJ 导出器。这真的很烦人。

这是问题的一些屏幕。

我想说的是: 我尝试着色的内容

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

备注: 什么是有色的

如果我们转到 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文件会很烦人...

再次编辑

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

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

网格位于

更大的图像

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

第二个问题,在第二列,您可以看到“Conserjeria”房间的几何属性,我认为这里是问题产生的地方......在第三列,我向您展示了我的“Conserjeria”对象的奇怪“顶点”数组. 我说很奇怪,因为它是由 6272 个索引组成的……的 OBJ 文件中没有 6272 个顶点……你可以在这里看到 OBJ,如果你想查看它的结构,你可以找到Conserjeria (52v、11vn、80f ) . 这可能是为什么当我尝试仅评论某些对象时它会评论很多对象的原因吗?

我还尝试了3 个盒子的简化模型,其中 2 个被正确注释,但第一个没有,看看(使用复选框来注释它们)我无法想象为什么会发生这种情况。(当场景中只有 3 个立方体时,数组中还有 7 个 THREE.MESH 索引...)

测试立方体

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

感谢所有试图帮助我的人。

4

1 回答 1

1

看起来你的网格名称有问题。

当我执行以下脚本时,它工作得很好:

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

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

于 2015-09-26T12:49:50.653 回答