2012-11-02 9 views

Odpowiedz

18

Biorąc pod uwagę stare normalne N oraz nową normalną N' można uzyskać obrót przez:

RotationAxis = cross(N, N') 
RotationAngle = arccos(dot(N, N')/(|N| * |N'|)) 

przypadku

  • cross(x, y) jest iloczynem wektorów x i y
  • dot(x, y) jest iloczyn skalarny wektorów x i y
  • |x| jest długość wektora x

Spowoduje to obrócenie starego normalnego na nowy najkrótszym możliwym sposobem.

Uwagi

  • RotationAngle będzie w radianach (jeśli ARccOS zwraca rad jak ma to miejsce w większości implementacji)
  • arccos jest odwrotnością funkcji cosinus. Jest to konieczne, ponieważ dot(N, N') = |N| * |N'| * cos(RotationAngle) gdzie RotationAngle jest kątem między wektorami.
  • RotationAxis nie jest znormalizowana
  • Jeżeli obie normalne są znormalizowane podział przez (|N| * |N'|) staje się zbędne (w rzeczywistości jeśli N normalizuje można pominąć |N| produktu i jeśli N' normalizuje następnie opuścić |N'|)
  • ten metoda nie powiedzie się, jeśli N' = -N (ponieważ jest nieskończenie wiele najkrótszych sposobów)

Jak to działa?

Pierwsza uwaga jest taka, że ​​dwa normalne zawsze definiują (przynajmniej) jedną płaszczyznę, na której leżą. Najmniejszy kąt, który je rozdzieli, będzie mierzony również w tej płaszczyźnie.

Więc RotationAxis wektor będzie normalny płaszczyzny, która otacza zarówno N i N' i RotationAngle to najmniejszy kąt pomiędzy dwoma wspomniano wcześniej.

więc, obracając się wokół RotationAxis przez RotationAngle stary normalne N jest obrócony w płaszczyźnie, w najkrótszej ścieżce w kierunku N'.

+2

+1 ale możesz pominąć podział przez (| N | * | N |), ponieważ normalne wektory mają długość 1. –

+0

@ AD-530 Jak napisałem w notatkach :) Ale ja zredagowałem to być bardziej jasne teraz. Normalne nie muszą być normalizowane, muszą tylko być prostopadłe do płaszczyzny. – Nobody

+0

Dziękuję bardzo, bardzo mi pomogło – rraallvv

Powiązane problemy