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'
.
+1 ale możesz pominąć podział przez (| N | * | N |), ponieważ normalne wektory mają długość 1. –
@ 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
Dziękuję bardzo, bardzo mi pomogło – rraallvv