簡體   English   中英

如何訪問由OBJMTLLoader加載的OBJ的不同部分?

[英]How can I access different parts of an OBJ loaded with OBJMTLLoader?

我用3DS Max制作了一個建築物模型,其中每個房間都是一個修改過的立方體,我使用OBJMTLLoader用他自己的MTL加載OBJ文件。 問題是我需要根據用戶要求強調某些房間。

我使用dat.gui來顯示菜單,用戶可以在其中檢查/取消選中房間以對其進行標記(我想我會更改房間大小或材料以強調它)。

這是我的裝載機的代碼

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

它可以正常工作,但是當我嘗試訪問幾何的內部多維數據集以在線框中對其進行標記時(例如),問題就來了:

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鏈接您還可以在那里查看所有代碼;)

謝謝您的關注,希望有人能幫助我。

編輯:當我這樣做時:

 scene.getObjectByName("nameOfModule").material.color.set(0xff0000); 

用紅色標記或僅用以下標記:.material.wireframe = true; 它說明了很多未實現的內容。 當我使用scene.getObjectById(ObjectId,true)時,它的作用相同。 但是它沒有在DOM樹中顯示對象的名稱。

我正在嘗試使用其他導出工具來查看問題是否僅是OBJ導出器。 這真的很煩人。

這是問題的一些屏幕。

我想說明一下: 我嘗試着色的東西

如您所見,它只是一個編輯框

備注: 什么是有色的

如果我們轉到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正在為我的幾何圖形創建多邊形組,據我所知,OBJMTL會忽略“ g”組,因此當我嘗試標記某些內容時,它會標記很多東西...出口商...手動分析OBJ文件會很煩人...

再次編輯

我一直在探索選項,並且3DS MAX可以很好地生成OBJ,但是當我探索de DOM Tree時,我可以看到THREE.Mesh是一個數組,其中只有一對對索引中有自己的預期對象名稱和奇數索引具有某種沒有分配名稱就無法控制的幾何,並且由於某些奇怪的原因,在幾何實例中創建了一些毫無意義的“頂點”組,我上傳了一些屏幕和OBJ / MTL文件使我的問題更清楚:

看看這個,我現在嘗試標記一個名為“ Conserjeria”的模塊。 這是位於DOM樹中的模塊:

網格位於

圖片更大

在第一列上,我們可以看到, 第一個問題 ,我的OBJ(所有幾何圖形)文件只有298個對象,那么為什么會有1056個網格對象? 這不是很相關,因為其中大多數名稱都是空的。

第二個問題 ,在第二列上,您可以看到“ Conserjeria”房間的幾何屬性,我認為這是問題所在。在第三列上,我為您的“ Conserjeria”對象顯示了奇怪的“頂點”數組。 我說奇怪,因為它是由6272項指標組成的... 沒有在我的OBJ文件中有6272個頂點......你可以看到OBJ 在這里 ,你可以找到Conserjeria如果你想看到它的結構(52V,11vn,80F ) 可能這就是為什么當我嘗試僅標記某些對象時會標記很多對象的原因嗎?

我還嘗試了3個框簡化模型 ,其中2 個框已正確標記,但第一個框沒有,請看一眼(使用復選框對其進行標記),我無法想象為什么會這樣。 (當場景中只有3個多維數據集時,數組中還有7個THREE.MESH索引...)

TestingCubes

對僅評論我的房間有幫助嗎? 如果需要,我可以共享我擁有的所有內容(代碼,OBJ,MTL,3ds ...)

感謝所有試圖幫助我的人。

看起來您的網格名稱有問題。

當我執行以下腳本時,它可以正常工作:

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

不出所料,這會使模型的一部分變成紅色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM