2013-02-26 30 views
38

Làm thế nào để có được vị trí toàn cục của một Object3D bên trong một Object3D khác?Làm thế nào để có được vị trí toàn cầu/thế giới của một đối tượng con?

thiết lập:

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

ghi chú:

Tôi nghĩ rằng đây sẽ là cách để làm điều đó:

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

... nhưng nó mang lại cho tôi (100, 100, 100), không phải (200, 200, 200).

Trả lời

50

cuộc gọi đầu tiên

scene.updateMatrixWorld(); 

hoặc trong ví dụ của bạn, nó là đủ để gọi

parent.updateMatrixWorld(); 

Sau đó trích xuất các vị trí trên thế giới

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

Trên thực tế, tuy nhiên, các cuộc gọi renderer updateMatrixWorld() cho bạn trong mỗi vòng lặp kết xuất, do đó bạn không phải làm như vậy.

EDIT: cập nhật để Three.js r.65

+0

Cảm ơn bạn WestLangley, theo lời khuyên của bạn tôi đã làm điều này: ** console.log (parent.position.getPositionFromMatrix (child.matrixWorld)) ** Nhưng, kể từ khi mã sống là actruly bên trong một vòng lặp mà di chuyển những thứ xung quanh , điều này dẫn đến một số hiện vật kỳ lạ, nơi vận tốc của đối tượng cha mẹ sẽ tăng đáng kể (điều này chỉ console.logging vị trí con) ! Vì tôi không hiểu chính xác những gì đang xảy ra (sẽ đọc lên trên nó tho), tôi đã kết thúc: ** console.log (parent.position.clone(). GetPositionFromMatrix (child.matrixWorld)) ** * Cảm ơn một lần nữa. * – TunnelVision

+1

Không, không! Tạo một vector riêng biệt bên ngoài vòng lặp render và gán nó giá trị vị trí bên trong vòng lặp render. – WestLangley

+0

ah, bây giờ tôi nhận được nó :) – TunnelVision

0

Trong threejs r89 bạn chỉ có thể có được vị trí trên thế giới bởi Object3D.getWorldPosition. Tôi không biết khi nào nó được thêm vào.

Các vấn đề liên quan