Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 网格的ObjmtlLoader名称为空_Javascript_3d_Three.js - Fatal编程技术网

Javascript 网格的ObjmtlLoader名称为空

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,最

当我使用objmtloader而不是OBJLoader时,我有一种无法解释的bug。 我的obj文件包含两个加载程序在不同子网格中加载的组

我在两个案例中作为一个孩子的场景是一个3.Object3D,孩子数量相同:1837。 但是,当我在js控制台中显示此对象并检查它时:

  • 对于使用OBJLoader加载的对象,第一个子对象的id为12,每个新网格的id增加一个,并以id 1848结束。这是有道理的
  • 使用OBJMTLLoader加载相同的对象时,缺少一些id,事实上,第一个子对象的id为13,最后一个子对象的id为5521。例如,这里是5个第一个孩子的id:13191925
<>这可能不是问题,但这里是故事的棘手的部分,为了我的项目的目的,我使用RayCter来改变所选网格的颜色(点击它)。我还会显示选定网格的名称:

  • 使用OBJLoader时,当我使用光线投射器时,我修改网格的颜色并显示名称,没有任何问题
  • 但是使用OBJMTLLoader,我可以毫不费力地更改所选网格的颜色,但是网格的名称是空的(没有任何字符)
有趣的是,在这两种情况下,每个网格都有一个导入良好的名称

唯一奇怪的是,当我在两种情况下使用OBJLoader显示所选网格的id时,我可以在js控制台的对象显示中找到网格列表中的该id和名称对应,但使用Object3D中找不到我得到的OBJMTLLoader id

有人知道问题出在哪里吗

提前多谢

更新:

我已经找到了解决方案的一部分,但仍然有一些奇怪的地方,下面是我使用THREE.OBJMTLLoader导入3D模型时的结构示例:

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肯定不会命名。。。