2013-01-10 8 views
10

Jestem nowym użytkownikiem programów three.js i 3d, więc może się to wydawać bardzo prostym pytaniem. Idealnie, mam nadzieję, że odpowiedź pomoże mi zrozumieć podstawowe zasady.Three.js - Jak obrócić obiekt, aby go spojrzeć? W jednym punkcie i orientować się w kierunku innego

Mam obiekt, który musi "wskazywać" w innym punkcie (pochodzenie, w tym przypadku dla uproszczenia), co można łatwo wykonać za pomocą funkcji Object3D.lookAt(point). To punktycznie ładnie wskazuje oś Z obiektu.

Chcę również obrócić mój obiekt o nazwie looker wokół jego osi Z w taki sposób, że jego punkty osi X generalnie wskazują inny obiekt, refObj. Wiem, że oś X nie może wskazywać bezpośrednio na refObj, chyba że obiekt ten tworzy kąt prosty z punktem początkowym. Chcę osi X looker leżeć na płaszczyźnie utworzonej przez origin, refObj i looker, jak na schemacie przedstawionym poniżej:

diagram of problem

Najprostszym sposobem robi obrót wydaje się zmodyfikowanie looker.rotation.z, ale nie wiem, jak obliczyć, jaka powinna być wartość.

Ogólnie, chciałbym rozszerzoną wersję funkcji lookAt, która przyjmuje drugą współrzędną, na którą zorientowana będzie oś X. Coś takiego:

function lookAtAndOrient(objectToAdjust, pointToLookAt, pointToOrientXTowards) 
{ 
    // First we look at the pointToLookAt 
    objectToAdjust.lookAt(pointToLookAt); 

    // Then we rotate the object 
    objectToAdjust.rotation.z = ??; 
} 

Stworzyłem jsFiddle with the example diagramed above

Odpowiedz

14

czego naprawdę chcesz powiedzieć, oś y obiektu (obiekt za up-vector) być prostopadłe do płaszczyzny.

Wszystko, co musisz zrobić, to ustawić obiekt up -vector przed wywołaniem lookAt(origin).

Oblicza się pożądany wektor up, pobierając produkt krzyżowy z dwóch wektorów, o których wiadomo, że znajdują się w płaszczyźnie.

Oto skrzypce pracy: http://jsfiddle.net/rQasN/43/

pamiętać, że istnieją dwa rozwiązania problemu, ponieważ zarówno komputerowej wektora i jego negacja będzie prostopadły do ​​płaszczyzny.

EDYCJA: skrzypce zaktualizowano do pliku three.js r.71