如何访问使用 OBJ MTL Loader 加载的 OBJECT 的不同部分?
How can I access different parts of an OBJ loaded with OBJMTLLoader?
我用3DS Max制作了一个建筑模型,每个房间都是一个修改过的立方体,我用OBJMTLLoader用他自己的MTL加载了OBJ文件。
问题是我需要根据用户要求强调某些房间。
我使用 dat.gui 显示一个菜单,用户可以在其中 check/uncheck 房间进行评论(我想我会更改房间大小或材料以强调它)。
这是我加载程序的代码
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 名称命名每个模块。但它不起作用,看起来该项目已找到,因为我没有收到任何错误,但它没有出现在线框中,当我使用另一个房间名称时,有时程序会在线框中显示很多可以包括的东西请求的一个与否,它找到的另一个 "undefined" 我认为它与 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 文件会很烦人...
再次编辑
我一直在探索这些选项,OBJ 可以由 3DS MAX 生成,但是当我探索 de DOM 树时,我可以看到 THREE.Mesh 作为一个数组,其中只有一些成对索引有预期的对象和他自己的名字,奇数索引有某种几何图形,如果没有分配任何名称我无法控制,并且出于某种奇怪的原因,在几何图形中创建了一些 "vertices" 组没有任何意义的实例,我上传了一些屏幕和 OBJ/MTL 文件以使我的问题更清楚:
看这个,我现在尝试评论一个名为"Conserjeria"的模块。这是位于 DOM 树中的模块:
在这里,在第一列我们可以看到,第一个问题,我的 OBJ(所有几何)文件只有大约 298 个对象,所以 为什么有 1056 个 Mesh 对象? 这不是很相关,因为大多数都是空名称。
第二个问题,在第二列你可以看到"Conserjeria"房间的几何属性,我想这里就是问题产生的地方。 .
在第三列中,我向您展示了我的 "Conserjeria" 对象的奇怪 "vertices" 数组。我说奇怪,因为它是由 6272 个索引组成的... NOTHING 在我的 OBJ 文件中有 6272 个顶点... 你可以看到 OBJ here,你可以找到Conserjeria 如果您想查看其结构 (52v, 11vn, 80f)。这可能就是为什么当我试图只评论某些对象时它评论了很多的原因吗?
我也试过3个盒子的简化模型,其中2个是正确的,但第一个不是,看看(使用复选框来评论他们)我无法想象为什么会这样。 (当场景中只有3个立方体时,数组中也有7 THREE.MESH个索引...)
只备注我的房间有什么帮助吗?如果需要,我可以分享我拥有的一切(代码、OBJ、MTL、3ds...)
感谢所有试图帮助我的人。
看起来你的网格名称有问题。
当我执行以下脚本时,它工作正常:
scene.children[2].traverse(function(c) {
if(c.material && c.name.indexOf("INVESTIGACION_1_") >= 0) {
c.material.color.set(0xff0000)
}
})
正如预期的那样,将部分模型染成了红色。
我用3DS Max制作了一个建筑模型,每个房间都是一个修改过的立方体,我用OBJMTLLoader用他自己的MTL加载了OBJ文件。 问题是我需要根据用户要求强调某些房间。
我使用 dat.gui 显示一个菜单,用户可以在其中 check/uncheck 房间进行评论(我想我会更改房间大小或材料以强调它)。
这是我加载程序的代码
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 名称命名每个模块。但它不起作用,看起来该项目已找到,因为我没有收到任何错误,但它没有出现在线框中,当我使用另一个房间名称时,有时程序会在线框中显示很多可以包括的东西请求的一个与否,它找到的另一个 "undefined" 我认为它与 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 文件会很烦人...
再次编辑
我一直在探索这些选项,OBJ 可以由 3DS MAX 生成,但是当我探索 de DOM 树时,我可以看到 THREE.Mesh 作为一个数组,其中只有一些成对索引有预期的对象和他自己的名字,奇数索引有某种几何图形,如果没有分配任何名称我无法控制,并且出于某种奇怪的原因,在几何图形中创建了一些 "vertices" 组没有任何意义的实例,我上传了一些屏幕和 OBJ/MTL 文件以使我的问题更清楚:
看这个,我现在尝试评论一个名为"Conserjeria"的模块。这是位于 DOM 树中的模块:
在这里,在第一列我们可以看到,第一个问题,我的 OBJ(所有几何)文件只有大约 298 个对象,所以 为什么有 1056 个 Mesh 对象? 这不是很相关,因为大多数都是空名称。
第二个问题,在第二列你可以看到"Conserjeria"房间的几何属性,我想这里就是问题产生的地方。 . 在第三列中,我向您展示了我的 "Conserjeria" 对象的奇怪 "vertices" 数组。我说奇怪,因为它是由 6272 个索引组成的... NOTHING 在我的 OBJ 文件中有 6272 个顶点... 你可以看到 OBJ here,你可以找到Conserjeria 如果您想查看其结构 (52v, 11vn, 80f)。这可能就是为什么当我试图只评论某些对象时它评论了很多的原因吗?
我也试过3个盒子的简化模型,其中2个是正确的,但第一个不是,看看(使用复选框来评论他们)我无法想象为什么会这样。 (当场景中只有3个立方体时,数组中也有7 THREE.MESH个索引...)
只备注我的房间有什么帮助吗?如果需要,我可以分享我拥有的一切(代码、OBJ、MTL、3ds...)
感谢所有试图帮助我的人。
看起来你的网格名称有问题。
当我执行以下脚本时,它工作正常:
scene.children[2].traverse(function(c) {
if(c.material && c.name.indexOf("INVESTIGACION_1_") >= 0) {
c.material.color.set(0xff0000)
}
})
正如预期的那样,将部分模型染成了红色。