[ glorius @ 10.09.2004. 18:36 ] @
Guglovao sam ali nista.

Problem je sledeci:
Ako rotiram objekat pomocu Quaterniona npr. oko neke ose:

AxisAngleRotation(CVector3 axis, float angle)

Ili pomocu matrica:

MatrixFromAxisAngle(CVector3 axis, angle)

Posle nekoliko ovakvih rotacija ne znam orijentaciju objekta: ugao prema x-osi, y i z.

U MAXSDK-u sam video funkciju DecompMatrix(...) ili tako nesto, koja "izvlaci" trenutne uglove iz matrice.Ne postoji implementacija f-je. Da li je uopste moguce dobiti uglove iz matrice nekom dekompozicijom? Trenutnu poziciju iz matrice znam da izvucem ( m[13], m[14], m[15] , valjda. Ne mogu se bas setiti koji su clanovi ali mislim da su ovi). Znaci, kako dobiti uglove iz matrice?
[ Srki_82 @ 10.09.2004. 19:00 ] @
Zasto jednostavno ne koristis 3 promenljive koje ce drzati u sebi uglove rotacije oko x, y i z ose? Tako ces uvek znati kako ti je objekat okrenut.
[ glorius @ 10.09.2004. 19:11 ] @
Da, ali sa bih izbegao Gimble Lock (primer koda)

glRotatef(60, 1, 0, 0) // po X osi
glRotatef(60, 0, 1, 0) // po Y osi
glRotatef(60, 0, 0, 1) // po Z osi

koristim Quaternion pa ga prebacujem u matricu:

CQuat q;
q.EulerToQuat(0, 30, 30);
CMatrix rot;
rot.QuatToMatrix(q);
itd...

Nema Gimble Locka-a i ovako mogu da pratim promenu uglova.

Ali ako hocu da rotiram objekat oko neke ose pod nekim uglom:

CQuat q;
q.AxisAngleToQuat(CVector3 vAxis, float fAngle) //npr vAxis(1, 0.5, 0) fAngle =30 deg

CMatrix rot;
rot.QuatToMatrix(q);
itd...

sada ne mogu da pratim promenu uglova posto se rotacija vrsi oko proizvoljne ose.
...

F1!
[ bkaradzic @ 10.09.2004. 19:25 ] @
Citat:
glorius:Znaci, kako dobiti uglove iz matrice?


Ono što tražiš je:

ToEulerAnglesXYZ
http://www.magic-software.com/Source/Math/WmlMatrix3.inl

Citat:
glorius: Da, ali sa bih izbegao Gimble Lock (primer koda)


Mala ispravka: Gimbal Lock.

Branimir
[ Reljam @ 10.09.2004. 20:02 ] @
Igrom slucaja, ne samo da ima ta funkcija u D3DXu, nego je to i moj prvi D3D API :)

http://msdn.microsoft.com/libr...s/math/d3dxmatrixdecompose.asp
[ Srki_82 @ 10.09.2004. 20:21 ] @
Stvarno se divim timu koji radi na kreiranju DirectX-a... misle na sve :)
[ Reljam @ 10.09.2004. 21:14 ] @
Misle oni na kojesta, a da li to i urade... :)

To sto ta funkcija postoji nije razlog da koristis proste uglove, vec gledaj da sve radis preko matrica.

Sta ce ti dekomponovanje matrica?

[ glorius @ 11.09.2004. 13:12 ] @
Hvala ljudi.

Sta ce mi dekompozicija matrice?

Radim u OpenGL (trenutno).
Dosta sam radio sa tim transformacijama i provalio da posle slozenih rotacija lakse mi je samo da izvucem iz matrice trenutne vrednosti uglova nego da pratim uglove...
[ Reljam @ 11.09.2004. 17:16 ] @
Probaj da uopste ne koristis uglove, vec da sve radis preko matrica. Jer skoro sigurno tebi u stvari uglovi i ne trebaju, vec samo orijentacija, a to matrice rade mnogo bolje od uglova.

Pogledaj program koji radis i preispitaj da li ti uopste i trebaju uglovi.
[ maxmagnus2 @ 15.09.2004. 01:02 ] @


Citat:
Srki_82: Zasto jednostavno ne koristis 3 promenljive koje ce drzati u sebi uglove rotacije oko x, y i z ose? Tako ces uvek znati kako ti je objekat okrenut.


Kako kontrolises orijentacije pomocu samo jedne matrice?

Sta tacno radis, tj sta mnozis sa cim?
[ Srki_82 @ 15.09.2004. 08:17 ] @
Ja radim ovako:

1. matrica: translacija objekta da njegov centar bude u 0,0,0

2. matrica: skaliranje

3. matrica: rotiranje (objekat ce biti rotiran oko svoje ose, ako hoces da ga rotiras oko neke druge tacke, moras da ga pre toga transliras)

4. matrica: transliranje na stvarnu poziciju

5. matrica: View matrica ili polozaj kamere

6. matrica: matrica koja projektuje 3D tacke u 2D tacke

kad sve te matrice pomnozis dobijes jednu koja kontrolise poziciju objekta na ekranu
[ maxmagnus2 @ 15.09.2004. 09:04 ] @
Citat:
Srki_82: Ja radim ovako:

1. matrica: translacija objekta da njegov centar bude u 0,0,0

2. matrica: skaliranje

3. matrica: rotiranje (objekat ce biti rotiran oko svoje ose, ako hoces da ga rotiras oko neke druge tacke, moras da ga pre toga transliras)

4. matrica: transliranje na stvarnu poziciju

5. matrica: View matrica ili polozaj kamere

6. matrica: matrica koja projektuje 3D tacke u 2D tacke

kad sve te matrice pomnozis dobijes jednu koja kontrolise poziciju objekta na ekranu


1. OK
2. skaliras za koje argumente matrice?
3.-||-
4.da li je to matrica kojom vracas sa 0,0,0 na prethodnu lokaciju tj matrica 1
samo sa *(-1) argumentima najnize kolone?
5. kako "vadis" ovu matricu?
6.Ovo ne znam sta je.
[ Srki_82 @ 15.09.2004. 17:14 ] @
Ti peske mnozis matrice, sam ih punis i sve ostalo? Ako tako radis, ne mogu mnogo da ti pomognem jer ja koristim pomocne funkcije u DirectX-u koje to sve rade umesto mene. Npr. matricu za polocaj kamere dobijas ovako:

D3DXMatrixLookAtLH( mat, EyePt, LookAt, UpVec)

EyePt je koordinata iz koje gledas, LookAt je koordinata tacke u koju gledas, a UpVec je vektor koji govori na koju stranu je "gore". Na kraju u mat dobijas View matricu... a cak ni ne znas kako se ona uopste racuna :)
[ glorius @ 15.09.2004. 19:39 ] @
Da, ali lepo je ponekad znati kako stvari rade tj. "zaviriti ispod haube" :)

U pravu ste, mnoge stvari se mogu uraditi i na drugi nacin. Ali kako pratiti uglove ako rotirate objekat oko neke ose, a ne striktno oko X, oko Y i oko Z;

Npr: ugao rotacije je 30 deg, a osa rotacije (1, 0, 1). Da li ovo znaci da se objekat rotira 30 deg oko X i 30 deg oko Z.

Koristim OpenGL, rotacija pomocu Quaterniona (nikako da zapamtim kako se pise).

Funkcija je AxisAngleToQuat(float angle, CVector3 rotVector) ...
Posle pretvorim Quat u matricu itd...
[ maxmagnus2 @ 17.09.2004. 08:14 ] @
Citat:
glorius: Da, ali lepo je ponekad znati kako stvari rade tj. "zaviriti ispod haube" :)

U pravu ste, mnoge stvari se mogu uraditi i na drugi nacin. Ali kako pratiti uglove ako rotirate objekat oko neke ose, a ne striktno oko X, oko Y i oko Z;

Npr: ugao rotacije je 30 deg, a osa rotacije (1, 0, 1). Da li ovo znaci da se objekat rotira 30 deg oko X i 30 deg oko Z.

Koristim OpenGL, rotacija pomocu Quaterniona (nikako da zapamtim kako se pise).

Funkcija je AxisAngleToQuat(float angle, CVector3 rotVector) ...
Posle pretvorim Quat u matricu itd...


Sta je QuanteriMoon ili kako se vec pise?
[ bkaradzic @ 17.09.2004. 16:24 ] @
Citat:
maxmagnus2
Sta je QuanteriMoon ili kako se vec pise?


Piše se Quaternion.

Detaljan opis možeš naći na:
http://mathworld.wolfram.com/Quaternion.html
http://en.wikipedia.org/wiki/Quaternion

Branimir