2015-04-29 33 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