Javascript 网格的ObjmtlLoader名称为空
当我使用objmtloader而不是OBJLoader时,我有一种无法解释的bug。 我的obj文件包含两个加载程序在不同子网格中加载的组 我在两个案例中作为一个孩子的场景是一个3.Object3D,孩子数量相同:1837。 但是,当我在js控制台中显示此对象并检查它时:Javascript 网格的ObjmtlLoader名称为空,javascript,3d,three.js,Javascript,3d,Three.js,当我使用objmtloader而不是OBJLoader时,我有一种无法解释的bug。 我的obj文件包含两个加载程序在不同子网格中加载的组 我在两个案例中作为一个孩子的场景是一个3.Object3D,孩子数量相同:1837。 但是,当我在js控制台中显示此对象并检查它时: 对于使用OBJLoader加载的对象,第一个子对象的id为12,每个新网格的id增加一个,并以id 1848结束。这是有道理的 使用OBJMTLLoader加载相同的对象时,缺少一些id,事实上,第一个子对象的id为13,最
- 对于使用OBJLoader加载的对象,第一个子对象的id为12,每个新网格的id增加一个,并以id 1848结束。这是有道理的
- 使用OBJMTLLoader加载相同的对象时,缺少一些id,事实上,第一个子对象的id为13,最后一个子对象的id为5521。例如,这里是5个第一个孩子的id:13191925
- 使用OBJLoader时,当我使用光线投射器时,我修改网格的颜色并显示名称,没有任何问题李>
- 但是使用OBJMTLLoader,我可以毫不费力地更改所选网格的颜色,但是网格的名称是空的(没有任何字符)
THREE.Group
[...]
children : Array[1837]
0 : THREE.Object3D
[...]
name : "the name of the part"
children : Array[2]
0: THREE.Mesh
name : ""
children : Array[0]
[...]
1: THREE.Mesh
[...]
[...]
1 : THREE.Object3D
[...]
事实上,光线投射器计算与三个.Mesh的交点,名称存储在该网格的级别n-1处。这就是为什么我没有名字,当我试图显示它。
但是,为什么对于同一型号的3D装载机,我的n-1级装载机不存在?事实上,使用OBJLoader,对象的结构是:
THREE.Group
[...]
children : Array[1837]
0 : THREE.Mesh
[...]
name : "the name of the part"
children : Array[0]
[...]
1 : THREE.Mesh
[...]
基本上,当
OBJLoader
读取.obj
文件时,它会创建一个THREE.Object3D
,对于.obj
的每组,它会创建一个THREE.Mesh
并将其添加到Object3D
中,忽略obj
中的usemtl
。在.obj
中,每组将有一个三个.Mesh
,名称正确,很酷
然而,objmtloader
不会忽略usemtl
。由于网格
与几何体
和材质
绑定,如果更改材质
,则必须创建另一个网格
。因此,当它看到新的组时,它将创建一个具有正确名称的Object3D
,并且该Object3D
的子项将是具有不同材质的零件
如果你想得到真实网格的名称,你可能想做一些像
intersect.object.parent.name
那么你是说你在blender、max等中创建了一个网格,那么当你导入一些有id的和一些没有id的时?我已经更新了我的问题。我想我的网格来自blender,它是一个.obj文件,纹理存储在.mtl文件中。id的问题来自这样一个事实,即我没有在我发布的更新中解释的3D对象的结构中看到OBJMTLLoader创建的新级别。我认为这就是obj的创建方式,我认为网格的子网格没有名称,除非你手动指定一个,比如说我有一个角色网格,该网格就像所有顶点、面等的容器,而不是编辑模式下的im,并开始在网格内添加其他对象,这些im肯定不会命名。。。