2013-02-26 102 views
38

如何獲得Object3D在另一個Object3D中的全局位置?如何獲得子對象的全局/世界位置?

設置:

var parent = new THREE.Object3D(); 
parent.position.set(100, 100, 100); 

var child = new THREE.Object3D(); 
child.position.set(100, 100, 100); 
parent.add(child); 

scene.add(parent); 

筆記:

我認爲這是做它的方式:

console.log(child.localToWorld(parent.position)); 

...但它給了我(100,100,100),而不是(200,200,200)

回答

50

首先調用

scene.updateMatrixWorld(); 

或在您的例子,就足以叫

parent.updateMatrixWorld(); 

然後將解壓後世界上的地位

var vector = new THREE.Vector3(); 
vector.setFromMatrixPosition(child.matrixWorld); 

然而在實踐中,渲染器調用updateMatrixWorld()爲你在每個渲染循環,所以你不必。

編輯:更新到three.js所r.65

+0

謝謝WestLangley,下面你的建議我這樣做: **的console.log(parent.position.getPositionFromMatrix(child.matrixWorld))** ,但由於現場的代碼是actruly一個循環,圍繞移動裏面的東西,這會導致一些奇怪的構件,其中父對象的速度會顯着增加(這是唯一的console.logging childs位置) !由於我不明白到底發生了什麼(我會讀到它),我最終做了: ** console.log(parent.position.clone()。getPositionFromMatrix(child.matrixWorld))** *再次感謝。* – TunnelVision 2013-02-26 23:30:14

+1

不,不!在渲染循環外部創建一個單獨的矢量,並在渲染循環內爲其指定位置值。 – WestLangley 2013-02-27 00:36:34

+0

啊,現在我明白了:) – TunnelVision 2013-02-27 14:59:08