2014-04-17 30 views
1

我需要將我的對象從常規座標轉換爲地球上的相對座標。我計算了一個非常好的變換矩陣,並將其設置爲如下所示的對象。 Object.matrixAutoUpdate = false; Object.matrix =我的矩陣; 它工作正常。但稍後當我需要在z上執行一個縮放。什麼都沒有發生,我想這是因爲我關閉了自動更新。所以我在更改比例後調用updateMatrix()。規模確實發生了變化,但變換矩陣變回了默認值。Three.js更新對象的矩陣和比例?

我做錯了什麼?

順便說一句,如果我不使用矩陣,並改變對象的向上向量。該值永遠不會改變。它始終是0,1,0。

回答

1

修改object.matrix時,需要將object.matrixWorldNeedsUpdate設置爲true

+0

這仍然是這種情況?我在WebGLRenderer中看到它調用'scene.updateMatrixWorld()',它調用'updateMatrixWorld(true)'在它的所有子節點上,這似乎強制更新所有子世界矩陣,因此如果我們調用'renderer.render()每次打勾時,每次修改object.matrix時都不需要將object.matrixWorldNeedsUpdate設置爲true。 – trusktr

0

如果要使用對象矩陣,請將matrixAutoUpdate設置爲false,此處爲變換代碼,旋轉x,y,z序列,然後執行縮放,上次變換。

rM = new THREE.Matrix4().multiplyMatrices(new THREE.Matrix4().makeRotationY(rV.y), new THREE.Matrix4().makeRotationX(rV.x)); 
rM.premultiply(new THREE.Matrix4().makeRotationZ(rV.z)); 
object.matrix.copy(rM).scale(sV).setPosition(tV); 

在這裏你不能使用updateMatrix它會根據對象posiiton,縮放,旋轉它並沒有改變,當你設置的矩陣信息更新矩陣。

+0

不要設置'matrixAutoUpdate = false',除非您熟悉庫的內部工作並理解這樣做的後果。 – WestLangley

+0

@WestLangley有什麼後果?我在三層之上構建一個lib,在這裏我正在計算三層以外的矩陣,並且我想將它們應用到所有對象上。有沒有不好的後果? – trusktr

+1

@trusktr如果已知該對象是靜態的,則只設置'matrixAutoUpdate = false'。更多信息[這裏](https://github.com/mrdoob/three.js/pull/3153)。 – WestLangley