2015-10-26 84 views
0

問題: 我正在尋找更新縮放後網格上的頂點位置。我這樣做是因爲我需要計算網格的體積。我正在創建一個克隆網格來完成此操作,因爲我需要在原始網格中將比例保持爲活動參數。three.js applyMatrix在比例結果中出錯

我是用在How to update vertices geometry after rotate or move object

與three.js所釋放出0.70工作得很好的答案,但上破發行0.72

我的代碼:

var volumeClone = new THREE.Mesh (this.mesh.geometry.clone(), new THREE.MeshBasicMaterial({ color: 0xff0000 })); 
    volumeClone.scale.z = heightScale; 
    volumeClone.updateMatrix(); 
    volumeClone.geometry.applyMatrix(volumeClone.matrix); 
    volumeClone.matrix.identity(); 
    volumeClone.geometry.verticesNeedUpdate = true; 
    volumeClone.scale.set(1, 1, 1); 
    console(calculateVolume(volumeClone)); 

結果:

Chrome中是:

遺漏的類型錯誤:無法讀取未定義 THREE.Geometry.computeBoundingBox 的特性 'setFromPoints' @ lib.min.js:3THREE.Geometry.applyMatrix

我曾嘗試: 我曾嘗試調查和隔離Geometry.js和Box3.js中的問題,並瞭解編程流程以瞭解爲什麼「this.boundBox」未定義,但我沒有找到問題。

問題: 語法是否正確?在這方面有沒有更新到three.js?

+0

使用three.js,而不是three.min.js,用於開發。使用three.js的當前版本。嘗試追查問題。如果你有問題,發佈一個jsfiddle。 – WestLangley

+0

好的,我做到了。我追溯到this.mesh.geometry.clone(),這似乎只複製faceVertexUvs,面,頂點和原型的問題。它不會複製Geometry.js中列出的幾何對象默認屬性?沒有名稱,類型,ID等,因此boundingBox未定義,這會導致Geometry.applyMatrix中的可見錯誤。我應該使用不同的克隆方法嗎? – Radio

+0

@WestLangley順便說一句,克隆的類型是extrudeGeometry。我不確定這是否是問題的一部分。 – Radio

回答

0

答案原來是因爲extrudeGeometry不包含與常規幾何相同的屬性,所以在它上面的工作不起作用,因爲缺少詳細信息。答案是將bufferGeometry轉換爲常規幾何,然後嘗試將其作爲常規幾何體使用。我瞭解使用緩衝區的性能優勢,但在這種情況下,我可以創建一個用於測量的幾何圖形,並在得到結果時將其捨棄。

因此,而不是「克隆」幾何形狀在我的問題顯示,我切換到從緩衝實例創建特定類型的幾何:

var volumeClone = new THREE.Mesh (new THREE.Geometry().fromBufferGeometry(this.mesh.geometry._bufferGeometry), new THREE.MeshBasicMaterial({ color: 0xff0000 })); 
    volumeClone.scale.z = heightScale; 
    volumeClone.updateMatrix(); 
    volumeClone.geometry.applyMatrix(volumeClone.matrix); 
    volumeClone.matrix.identity(); 
    volumeClone.geometry.verticesNeedUpdate = true; 
    volumeClone.scale.set(1, 1, 1); 
    console(calculateVolume(volumeClone)); 

這與任何幾何類型我有工作的好處拋到目前爲止:擠壓,進口網,原始...