2015-04-29 31 views
2

我有一种错误,当我使用OBJMTLLoader而不是OBJLoader时,我无法解释。 我的obj文件包含由不同子网格中的两个加载器加载的组。OBLMTLLoader网格名称为空

我有两个情况下,儿童的场景具有相同数量的孩子的THREE.Object3D的:1837年 然而,当我显示JS控制台该对象和我检查它:

  • 为OBJLoader加载的第一个孩子已经得到了id 12,id为每个新网格增加一个,并用id 1848完成。这是有道理的。
  • 与OBJMTLLoader相同的对象加载,一些id丢失,实际上第一个孩子有13作为id和最后的孩子有一个id等于5521.例如,这里是5个第一个孩子的ID:13 16 19 22 25

这可能不是问题,但这里是故事的棘手标准,以我的项目为目标,我使用raycaster来改变选定网格的颜色(通过单击它)。我还显示所选网格的名称:

  • 使用OBJLoader时,我使用raycaster修改网格的颜色并显示名称没有任何问题。
  • 但是使用OBJMTLLoader,我可以毫无困难地更改所选网格的颜色,但是网格的名称是没有任何字符的。

有趣的是,每个网格都有一个很好的名称在两种情况下导入。

唯一令人奇怪的是,当我在OBJLoader的两种情况下显示所选网格的ID时,我可以在js控制台的对象显示中找到此网格列表中的这个id,并且名称与OBJMTLLoader相对应我得到的id在Object3D中是无处可寻的...

有没有人知道问题出在哪里?

非常感谢!

UPDATE:

我已经找到了解决方案的一部分,但仍然有一些奇怪的事情,这里是当我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 
       [...] 

实际上,raycaster计算与THREE.MESH的交点,并且名称是从该网格的层次n-1存储的。这就是为什么我尝试展示它时没有名字的原因。 但是为什么OBJLoader我的等级n-1不存在相同的模型3D负载?实际上与OBJLoader对象的结构是:

THREE.Group 
    [...] 
    children : Array[1837] 
       0 : THREE.Mesh 
         [...] 
         name : "the name of the part" 
         children : Array[0] 
         [...] 
       1 : THREE.Mesh 
       [...] 
+0

所以你说你有一个在搅拌机,最大等创建的网格,然后当你导入一些有身份证和一些不? – Careen

+0

我已更新我的问题。 我认为我的网格来自搅拌机,它是一个.mtl文件中带纹理存储的.obj文件。 id的问题来自这样一个事实,即我在我的文章中发布的更新中所解释的,我没有在我的3D对象的结构中看到由OBJMTLLoader创建的新关卡。 –

+0

我认为这是如何创建obj,我认为网格的子网格没有名称,除非您手动指定一个名称,比如说我有一个字符网格,那么网格就像所有顶点面的容器等,而不是编辑中的im模式并开始在网格中添加其他对象,这些im确定将是无名的... – Careen

回答

0

基本上,当OBJLoader读取.obj文件,它创建一个THREE.Object3D和每个组的.obj的,它创建一个THREE.Mesh,并将其添加到Object3D,忽略.obj中的usemtl。您的.obj中的每个群组都会有一个THREE.Mesh,并且名称正确,而且很酷。然而,不会忽略usemtl。并且由于MeshGeometryMaterial绑定,所以如果更改Material,则必须创建另一个Mesh。因此,当它看到新的组时,它将创建一个带有正确名称的Object3D,而这个Object3D的孩子将是具有不同材质的部件。

如果你想得到真实网格的名称,你可能想要做一些像intersect.object.parent.name