我用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。这真令人讨厌。
以下是该问题的一些屏幕。
我试着说:
如您所见,它只是一个经过编辑的框
注意到的是什么:
如果我们转到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树中的模块:
这里,在第一列我们可以看到,第一个问题,我的OBJ(所有几何体)文件只有大约298个对象,所以为什么有1056个网格对象?它不是很相关,因为大多数都是空名。
第二个问题,在第二列你可以看到“Conserjeria”房间的几何属性,我想这里是产生问题的地方...... 在第三列,我向你展示了我的“Conserjeria”对象的奇怪的“顶点”数组。我说很奇怪,因为它由6272个索引组成...我的OBJ文件中的 NOTHING 有6272个顶点...你可以看到OBJ here,你可以找到 Conserjeria 如果你想看到它的结构(52v,11vn,80f)。这可能是为什么当我试着只注意某些物体时,它会说很多它们?
我也尝试过使用 3盒的简化模型,其中2个被正确评论,但第一个不是,看看(使用复选框来标注它们)我可以想象一下为什么会这样。 (当场景中只有3个立方体时,阵列中还有7个THREE.MESH索引...)
任何帮助只能说我的房间?如果需要,我可以分享我拥有的一切(代码,OBJ,MTL,3ds ......)
感谢所有想帮助我的人。
答案 0 :(得分:0)
看起来网格名称有问题。
当我执行以下脚本时,它的工作正常:
scene.children[2].traverse(function(c) {
if(c.material && c.name.indexOf("INVESTIGACION_1_") >= 0) {
c.material.color.set(0xff0000)
}
})
正如预期的那样,将模型的一部分染成红色。