Autor Wątek: Macierz przekształcenia z przestrzeni obiektu do przestrzeni swiata (z 3 vec)  (Przeczytany 2537 razy)

Offline MrKaktus

  • Użytkownik

# Czerwiec 15, 2008, 12:41:40
Czesc,

W mojej grze kazdy obiekt jest ukierunkowywany przy pomocy 3 wektorow: look, up , side. Gdy chce zeby moj obiekt wykonal akcje w stylu roll, turn czy move dokonuje odpowiednich obrotow lub przesuniec na tych wektorach (w ten sposob latwo jest manipulowac obiektem). Problem powstal gdy postanowilem wynikowa orientacje obiektu reprezentowana przez te 3 wektory przekszałcic do przestrzeni swiata. Nie moge dojsc jak powinna wygladac wynikowa macierz rotacji takiego obiektu. Domyslam sie ze pewnie juz takie pytanie padalo na forum, ale bardzo prosze o pomoc :).

Offline Mr. Spam

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

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 15, 2008, 13:41:52
Złóż op prostu te trzy wektory w macierz 3x3 i będziesz miał macierz rotacji. W jakiej kolejności oraz czy składać kolumnowo, czy wierszowo to już zależy od przyjętej notacji macierzy oraz przyjętych układów współrzędnych.

Offline MrKaktus

  • Użytkownik

# Czerwiec 15, 2008, 14:50:23
Dla kamery gdzie siwat jest przeksztalcany do przestrzeni kamery funkcja wyglada tak :

float4x4 Ccam::rotation_matrix(void)
{
 float4x4 m;
 float3   s = cross(this->a,this->b);
 float3   u = cross(s,this->a);
 float3   v = this->a * -1.0f;
 
 s.normalize();
 u.normalize();
 
 m.m[0] = s.x;   m.m[4] = s.y;   m.m[8]  = s.z;   m.m[12] = 0.0;
 m.m[1] = u.x;   m.m[5] = u.y;   m.m[9]  = u.z;   m.m[13] = 0.0;
 m.m[2] = v.x;   m.m[6] = v.y;   m.m[10] = v.z;   m.m[14] = 0.0;
 m.m[3] = 0.0;   m.m[7] = 0.0;   m.m[11] = 0.0;   m.m[15] = 1.0;
 
 return m;
}

a - look
b - up
c - side
p - position

Macierz jest w notacji OpenGL, uklad wspolrzednych jak w OpenGL a wektor side jest wynikiem cross(a,b).
No wlasnie pytanie brzmi jak umiescic te wektory, bo mozliwosci jest troche duzo  :).

Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Czerwiec 15, 2008, 14:53:50
Zajrzyj do dokumentacji DX lub OGL, w zaleznosci z czego korzystasz, a najlepiej zajrzyj w oba miejsca.

W obu znajudja sie funkcje tworzace macierze tak jak chcesz i w obu dokumentacjach jest opisane jak to jest robione.
Sa roznice, wiec pomysl, zanim przepiszesz cos na glupa.

EDIT:
No, pokazana przez Ciebie notacja nie jest stosowana w openGl'u, tylko w Dx

Offline MrKaktus

  • Użytkownik

# Czerwiec 15, 2008, 16:15:32
Nie ma znaczenia w jakiej notacji jest macierz, jezeli zapiszesz ja wedlug regol matematyki wzorem to potem juz sobie kazdy przeniesie na notacja taka czy inna. I tylko o to prosilem. Trudno poradze sobie jakos sam.

Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Czerwiec 15, 2008, 17:08:27
Hm, zglupialem. Skoro znasz wzory, to w czym problem ?
Budujesz macierze, mnozysz przez siebie i wysylasz do karty po ewentualnej traspozycji.

Notacja ma znaczenie, jesli sprobujesz wyslac ja w takiej formie do grafiki, to bedzie zle.

Offline MrKaktus

  • Użytkownik

# Czerwiec 15, 2008, 17:41:00
Ja pierdole czy czytanie ze zrozumieniem to taki problem ? Co za roznica jak sobie wizualnie uloze w kodzie zapis macierzy ?
Czy bedzie to tak :

m.m[0] = s.x;   m.m[4] = s.y;   m.m[8]  = s.z;   m.m[12] = 0.0;
m.m[1] = u.x;   m.m[5] = u.y;   m.m[9]  = u.z;   m.m[13] = 0.0;
m.m[2] = v.x;   m.m[6] = v.y;   m.m[10] = v.z;   m.m[14] = 0.0;
m.m[3] = 0.0;   m.m[7] = 0.0;   m.m[11] = 0.0;   m.m[15] = 1.0;

Czy tez tak ?:

m.m[0] = s.x;   m.m[1] = u.x;   m.m[2]  = v.x;   m.m[3] = 0.0;
m.m[4] = s.y;   m.m[5] = u.y;   m.m[6]  = v.y;   m.m[7] = 0.0;
m.m[8] = s.z;   m.m[9] = u.z;   m.m[10] = v.z;   m.m[11] = 0.0;
m.m[12] = 0.0;   m.m[13] = 0.0;   m.m[14] = 0.0;   m.m[15] = 1.0;

Skoro wartosci w niej sa te same? Pytam sie o matematyczny wzor na macierz rotacji.

Tu masz reprezentacje macierzy OpenGL w pamieci :
http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node25.html
Jest ona COLUMN-MAJOR czyli zapisana kolumna po kolumnie jezeli chcesz szczegoly znac.

A tu prawdopodobnie rozwiazanie mojego problemu:
http://icculus.org/~lucasw/OpenGL/Orientation%20Matrices.html

Wiecej sie czlowiek w takiej debilnej rozmowie nadenerwuje niz dowie. Chyba nie po to jest forum.

 

Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Czerwiec 15, 2008, 18:46:59
Oj, jak nie ladnie, wylgarny sie robisz. Tak duzo kosztuje odrobina kultury i cierpliwosci? Krzysiek.K juz Ci odpowiedzial, a ja odeslalem do odpowiedniej literatury. Wskazalem Ci rowniez prawdopodobny blad. Ty w zamian, raczysz klac i twierdzic, ze nie potrafie czytac ze zrozumieniem.

Od razu napisalem, ze masz ta macierz zle, bo uzywasz notacji DX.
Karta graficzna oczekuje, ze dostanie macierz:
m[0] = s.x    m[1] = s.y    m[2] = s.z   m[3]   =  T.x
m[4] = u.x    m[5] = u.y   m[6] = u.z   m[7]   =  T.y
m[8] = v.x    m[9] = v.y   m[10] = v.z  m[11]   =  T.z
m[12] = 0    m[13] = 0    m[14] = 0    m[15]   =  1

Czyli transponowana wzgledem tego co Ty masz. Jezeli korzystasz z OpenGl'a, a wnioskuje, ze tak, skoro twierdzisz, ze uzywasz ichniejszej notacji, to musisz sobie te macierz wlasnorecznie transponowac.
Jezeli korzystasz z DX, ale wysylasz macierz do shadera ukryta gdzies w VB, lub jako stala, to tez musisz sobie te swoja macierz transponowac.

Manual OpenGl: http://www.opengl.org/sdk/docs/man/
Poszukaj sobie gluLookAt.