2013-02-26 4 views
38

Jak uzyskać globalną pozycję obiektu Object3D wewnątrz innego obiektu Object3D?Jak uzyskać globalną/światową pozycję obiektu podrzędnego?

Setup:

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

Uwagi:

Myślałem, że będzie to sposób, aby to zrobić:

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

... ale daje mi (100, 100, 100), a nie (200, 200, 200).

Odpowiedz

50

pierwsze wezwanie

scene.updateMatrixWorld(); 

lub w przykładzie, wystarczy zadzwonić

parent.updateMatrixWorld(); 

Następnie ekstrahować pozycja w rankingu światowym

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

W praktyce jednak połączenia renderującego updateMatrixWorld() dla ciebie w każdej pętli renderowania, więc nie musisz tego robić.

EDIT: zaktualizowana Three.js r.65

+0

Dziękuję WestLangley po poradę Zrobiłem to: ** console.log (parent.position.getPositionFromMatrix (child.matrixWorld)) ** Ale ponieważ kod na żywo jest actruly wewnątrz pętli, która porusza się wokół rzeczy , w wyniku tego powstały dziwne artefakty, w których prędkość obiektu nadrzędnego zwiększyłaby się dramatycznie (ta jedyna konsola.logująca pozycję dziecka) ! Ponieważ nie rozumiem dokładnie, co się dzieje (przeczytam na ten temat), skończyłem robić: ** console.log (parent.position.clone(). GetPositionFromMatrix (child.matrixWorld)) ** * Jeszcze raz dziękuję. * – TunnelVision

+1

Nie, nie! Utwórz oddzielny wektor poza pętlą renderowania i przypisz mu wartość pozycji wewnątrz pętli renderowania. – WestLangley

+0

ah, teraz dostaję to :) – TunnelVision