2016-04-12 80 views
0

我正在使用ThreeJS將OBJ加載到網頁中,我已成功完成該操作,但現在我想將按鈕添加到我的網頁中,以便將顯示的OBJ文件替換爲另一個OBJ文件。我試圖在加載時命名對象:如何在Three.JS中交換另一個OBJ對象?

object.name =「selectedObject」;

,這樣我可以從現場的新按鈕被點擊時

刪除

scene.remove(selectedObject);

並附加新對象:

scene.add(newobject);

但我迷失在如何實現這個到通用代碼/正確的語法是什麼。

下面的代碼加載模型:

  var objectloading = 'obj/male02/new.obj'; 
var loader = new THREE.OBJLoader(manager); 
      loader.load(objectloading, function (object) { 

       object.traverse(function (child) { 

        if (child instanceof THREE.Mesh) { 

         child.material.map = texture; 

        } 

       }); 

       object.position.y = -30; 
       scene.add(object); 

      }, onProgress, onError); 

任何幫助apreciated,謝謝!

回答

0

那麼有很多方法可以去做。結果是,你的代碼需要考慮已經加載的內容。你可以遍歷一個場景,但是捕獲你自己的obj文件並將它們列表到你自己的列表中會更清晰,尤其是在後續實現光線投射等時。

我會寫一些函數,如果我計劃在將來支持其他網格類型並希望單個接口,我可能會寫一些函數。重要的是,您不要將mesh名稱作爲參數傳遞給scene.add和scene.remove,而是將引用傳遞給實際對象。 Three.js這樣做是爲了它可以使父項無效並在Three.js庫中調用對象「已刪除」的調度事件。

因此,出於示例目的,一種方法是將對象存儲在散列中,並使用網格的url作爲添加和刪除的參數。

var meshes = {}; 

addObj = function(url){ 
    var objectloading = url; 
    var loader = new THREE.OBJLoader(manager); 
    loader.load(objectloading, function (object) { 
     object.traverse(function (child) { 
      if (child instanceof THREE.Mesh) { 
       child.material.map = texture; 
      } 
     }); 
     object.position.y = -30; 
     meshes[url] = object; 
     scene.add(object); 

    }, onProgress, onError); 
} 

removeObj = function(url){ 
    scene.remove(meshes[url]); 
    delete meshes[url]; 
} 

例如,兩種模式之間切換,

在點擊一個按鈕

removeObj('obj/male02/old.obj'); 
addObj('obj/male02/new.obj'); 

,然後在另一個按鈕點擊:

removeObj('obj/male02/new.obj'); 
addObj('obj/male02/old.obj'); 

雖然任何字符串可以用於「網格」中的成員名稱,如果應用程序增長並且使用了URL,則使用網址可能會產生問題rl實際上是一個使用POST請求的服務uri,那麼您將需要另一層引用,可能並且通常使用UUID賦予添加到Three.js的每個對象。

相關問題