2015-09-25 67 views
2

我用3DS Max製作了一個建築模型,其中每個房間都是一個修改過的立方體,我用OBJMTLLoader用他自己的MTL加載OBJ文件。 問題是我需要根據用戶要求強調某些房間。如何訪問裝有OBJMTLLoader的OBJ的不同部分?

我使用dat.gui來顯示一個菜單,用戶可以選中/取消選中房間來標記它們(我想我會改變房間的大小或marterial以強調它)。

這是我的裝載機的代碼

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; 
        } 

而且它工作正常,但probblem來時,我嘗試訪問幾何的內部立方體注意到他們在以線框(舉例來說)我使用:

contenido.getObjectByName("RoomNameIn3DSMax").material.wireframe=true; 

爲了以線框查找並顯示它,因爲OBJ文件使用其3DS Max名稱命名每個模塊。但它不起作用,它看起來像項目被找到,因爲我沒有得到任何錯誤,但它不會出現在線框中,當我使用另一個房間名稱,有時程序顯示線框很多的東西,可以包括所請求的一個或不是,它發現的另一個「未定義」我認爲這與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出口商。這真的很煩人。

下面是一些問題的屏幕。

我嘗試備註: What I try to tint

,你可以看到,它只是一個編輯框

什麼說: What is tinted

如果我們去到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是crea ting我的幾何體的多邊形組,並且據我所知,OBJMTL忽略「g」組,所以當我嘗試去評論某些東西時,它會評論很多東西......嘗試與其他導出器...手動解析OBJ文件會這麼討厭...

EDITED AGAIN

我一直在尋找解決方案,並obj利用3DS MAX中產生確定,但是當我去探索DOM Tree的,我可以看到三個.Mesh作爲一個數組,其中只有一些索引對具有他自己的名字,並且奇數索引具有某種幾何形狀,如果沒有任何名稱賦值,我無法控制它,出於某種奇怪的原因,有一些組在幾何實例中創建的「頂點」沒有任何意義,我上傳了一些屏幕和OBJ/MTL文件,使我的問題更清晰:

看看這個,我會嘗試現在評論一個名爲「Conserjeria」的模塊。這是一個位於DOM樹模塊:

Mesh located

Bigger image

這裏,在第一列上我們可以看到,第一個問題,我的OBJ(所有幾何)文件只有約298個對象,所以爲什麼有1056個Mesh對象?這不是很相關,因爲他們大多數都是空名。

問題二,你可以看到幾何屬性「Conserjeria」房間裏的第二列,我認爲這裏是產生問題... 在第三列,我告訴你,怪「頂點」數組爲我的「Conserjeria」對象。我說奇怪,因爲它是由6272個索引組成的... 什麼都沒有在我的OBJ文件中有6272個頂點...你可以看到OBJ here,你可以找到Conserjeria如果你想看到它的結構( 52v,11vn,80f)。可能這就是爲什麼當我嘗試僅評論某些對象時,它會評論他們中的很多?

我也試了一個3盒簡化模型,其中2個是正確的,但第一個不是,看看(用複選框來評論他們)我無法想像爲什麼這是否發生? (也有當有現場只有3個立方體數組中7 THREE.MESH指數...)

TestingCubes

只有一句話我的房間任何幫助嗎?如果需要,我可以分享我所擁有的一切(代碼,OBJ,MTL,3ds ...)

謝謝大家誰想要幫助我。

+0

我添加了關於我的具體問題的信息,並且「g」解析在OBJMTLLoader中是錯誤的(就像在OBJLoader中一樣)。我還添加了網格幾何的「頂點」問題。我希望現在有人可以幫助我...... @AVGP – soiber

+0

這是一個嚴重的記錄問題! – FutureCake

+0

謝謝,至少通過爲每個模塊創建新的特定材料來糾正問題。三,js解析MTL,並採用與同一對象相同材質的對象,爲它們分配相同的UUID標識符,而不管OBJ文件的內容如何(OBJLoader返回單個網格對其子節點的引用丟失)。 – soiber

回答

0

看起來你有一個網格名稱的問題。

當我執行下面的腳本,它工作得很好:

scene.children[2].traverse(function(c) { 
    if(c.material && c.name.indexOf("INVESTIGACION_1_") >= 0) { 
    c.material.color.set(0xff0000) 
    } 
}) 

那色彩模型的紅色,如預期的一部分。

+0

謝謝你的時間。我嘗試了你的腳本,但結果與我正在使用的腳本類似,它比與該名稱相關的多維數據集淡化了很多東西。我會嘗試用一些圖像更好地解釋我自己,看,這是我的「INVESTIGACION_1_」房間: [鏈接](http://imgur.com/0aRFlFk.png) 正如你所看到的,那一個是唯一的色彩立方體,但它色調所有這一切 [鏈接](http:///imgur.com/Dtsmn8u.png) 在這裏,我可以告訴你一個房間的色調之一,以證明它不是所謂的相同: [鏈接](http://imgur.com/sH4EBIL .png) 我真的很感謝你的幫助。 – soiber

+0

嗯,這讓我想知道Blender的OBJ出口商是否搞亂了不同的團體 – geekonaut

+0

謝謝你的迴應,我使用3DS Max,我會嘗試改進我的幾何形狀並嘗試另一種出口選擇,我真的很感謝你幫助,但如果別人可以給我一個解決方案,我會很高興。所以......我沒有做任何奇怪的事情嗎?我正在使用正確的方式訪問我的內部對象嗎? 再一次非常感謝你的時間,這對我來說是一個重要的項目(我的大學畢業設計項目)我開始使用它的時候我對Three.Js沒有任何的想法,但它很清楚,所以我認爲我沒有以正確的方式訪問我的內部對象。 – soiber