Autor Wątek: normalizacja układu wspołrzędnych  (Przeczytany 1893 razy)

Offline dawidb

  • Użytkownik

# Czerwiec 04, 2011, 18:00:40
Witam,
mam klase ktora enkapsuluje uklad wspolrzednych. Po obrotach i innych operacjach uklad z czasem sie denormalizuje. Chcialem napisac sobie f-cje, która znormalizuje mi ten uklad. To znaczy f-cja ta ma za zadanie przywrocic uklad do postaci takiej, ze: wekktowy bazowe sa dlugosci 1 i wektory bazowe sa do siebie prostopadle parami.
Wypociłem coś takiego:
normalize()
{
       forwardVector.normalize();
       upVector.set(  forwardVector.x,  -forwardVector.z, forwardVector.y );
}
Najpier normalizuje wektor do przodu, potem odbijam go i dostaje wektor do gory. Naomiast wektor x licze jako crossproduct wektora do gory i do przodu gdy jest to potrzebne.
Wydaje mi sie że powyzsze jest prawidlowe niemniej gdy normlaizuje sobie w taki sposob obiekt (napisanej przez siebie) kamery dostaje dziwne niezamierzone artefakty. Nie wiem czy blad tkwi tu czy gdzie indziej mam szukac.
pozdrawiam ; )

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Czerwiec 04, 2011, 18:11:17
mam klase ktora enkapsuluje uklad wspolrzednych
Przedstawia.

Rozumiem, że x to prawo, y to góra, a z to przód?

Offline dawidb

  • Użytkownik

# Czerwiec 04, 2011, 18:36:11
tak

Offline Stig

  • Użytkownik

# Czerwiec 04, 2011, 18:47:42
nie możesz po prostu załadować macierzy jednostkowej ?


Offline dawidb

  • Użytkownik

# Czerwiec 04, 2011, 19:01:03
nie moge. chodzi o to ze obiekt mojej klasy trzyma jakieś polozenie w przestrzeni i jakąś orientacje (czyli po prostu opisuje jakś uklad wspolrzednych ktory jest gdzies i jest jakoś zorientowany). Jesli zaladuje jednostke to sobie zupelnie skasuje wszelkie informacje. mi chodzi tylko o to ze on sie delikatnie 'rozjezdza' jak wykonac na nim wiele przksztalcen (normalna sprawa, bledy operacji zmiennoprzecinkowych sie kumupuja)

Offline Dab

  • Redaktor
    • blog

# Czerwiec 04, 2011, 19:19:00
Cytuj
       forwardVector.normalize();
       upVector.set(  forwardVector.x,  -forwardVector.z, forwardVector.y );

Dla (przykładowo) wektora (1,0,0) skończy się to kiepsko :) Jeżeli nie potrzebujesz skalowania to zamiast macierzy 4x4 można trzymać kwaternion i translację. Natomiast generalnie to po co ci takie składanie przekształceń? Zazwyczaj jest tak, że jest jakaś kamera + właściwości wyświetlania (FOV, aspect ratio) na podstawie których co klatkę budujesz macierz projekcji i widoku. Potem dla każdego obiektu masz macierz tegoż obiektu, mnożysz te 3 macierze ze sobą i masz gotową do użycia macierz.

Przykładowo ruch myszką nie powinien obracać macierzy widoku, tylko zmieniać kąt kamery, na podstawie którego tworzona jest co klatkę macierz.

Offline dawidb

  • Użytkownik

# Czerwiec 05, 2011, 17:25:00
Cytuj
Cytuj
    forwardVector.normalize();
           upVector.set(  forwardVector.x,  -forwardVector.z, forwardVector.y );



Dla (przykładowo) wektora (1,0,0) skończy się to kiepsko :)
masz racje.
Wiem ze w przypadku dwuwymiarowym mozna uzyskac wektor prostopadly do danegoprzez zamiane wspolrzednych i zminusowanie jednej. Np:  (x,y) i prostopadly do niego to (-y,x).
Myslalem ze tutaj tez tak zrobie tylko na plaszczyźnie YZ.
Okej to jak to w takim razie zrobic sensownie?

Offline Dab

  • Redaktor
    • blog

# Czerwiec 05, 2011, 17:29:57
Nie da się wyznaczyć go jednoznacznie, bo w przestrzeni 3D jest nieskończenie wiele wektorów prostopadłych do danego. Mając dwa można wyznaczyć trzeci przez cross-product (tak jak w 2D).

Offline dawidb

  • Użytkownik

# Czerwiec 05, 2011, 20:18:04
nie nie, mówiąc 'to' miałem na myśli ogólnie znormaliowanie układu a nie wyznaczenie wektora prostopadlego dodanego w przestrzeni 3D ; p
Jednym slowem pytalem o podpowiedz co do znormalizowania ukladu - jak to zrobić ?

Offline voytech

  • Użytkownik

# Czerwiec 06, 2011, 00:27:57
// X, Y, Z - "rozjechane" wektory układu współrzędnych po operacjach przekształcających

Z' = normalize( cross( X, Y) );
X' = normalize( cross( Y, Z') );
Y' = normalize( cross( Z', X') );

czy o to chodziło?