[ eva01 @ 09.04.2005. 14:49 ] @
Izvrsio sam konverziju verteksa iz max-ovog koordinatnog sistema (right handed) u d3d-ov (left handed) tako sto sam izvrsio zamenu z i y koordinata verteksa. Takodje konverziju quaternion-a za animaciju sam odradio na taj nacin (kao bilo kog verteksa). Trenutno imam problema sa konverzijom tj. generisanjem matrice kamere.

Posto sam podatke uzimao iz ase fajla (nije bas najpametnija solucija) ono sto imam je:
xyz - polozaj kamere
rotAxis + angle - dakle od ovoga mogu da napravim jedan quaternion

Ono sto mi treba jeste da dobijem inverznu transformaciju od ove (zato sto je u pitanju kamera).

Inverzija za xyz je trivijalna ali mi nije jasno kako da invertujem rotaciju oko ose. Pokusao sam da napravim matricu preko D3DXMatrixRotationAxis a zatim da nadjem inverznu matricu od ove kao i da invertujem ugao rotacije ali nisam dobio prave rezultate.

Posto sam se bas raspisao da ponovim jos jednom sta me interesuje:
1. Dali sam dobro izvrsio transformaciju verteksa i quaterniona iz right-handed u left-handed koordinatni sistem ?
2. Kako da napravim matricu transformacije koja je inverzna transformaciji datoj sa rotAxis + angle ? (i kod rotAxis sam izvrsio zamenu y i z zbog promene koordinatnog sistema).
[ nikbab @ 10.04.2005. 08:31 ] @
I ja sam nesto slicno radio za eksporter iz maxa za d3d format.

Evo koda:

/*
#define WRITE_MATRIX4_FROM_MATRIX3(pbCur, _matrix3) {Point3 __tempRow = ((Matrix3)_matrix3).GetRow(0);\
WRITE_POINT3(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(1); WRITE_POINT3(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(2); WRITE_POINT3(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(3); WRITE_POINT3(pbCur, __tempRow); WRITE_FLOAT(pbCur, 1);}
*/

#define WRITE_MATRIX4_FROM_MATRIX3(pbCur, _matrix3) {\
Point3 __tempRow = ((Matrix3)_matrix3).GetRow(0); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(2); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(1); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(3); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 1);}

Ovo sto je u komentaru je stara verzija a ovo MODIFIKOVANO je nova koja to radi kako treba. Obrati pzanju na _matrix3.GetRow(...) i bice ti jasno, samo prebaci da Row idu sledecim redosledom 2,1,3 umjesto 1,2,3.

poz
[ reject @ 10.04.2005. 15:14 ] @
Ne zelim da mutim vodu, ali zasto ne koristis .X i
za meheve i za animacije? Max moze da ga exportuje.
[ eva01 @ 10.04.2005. 22:39 ] @
Citat:
nikbab: I ja sam nesto slicno radio za eksporter iz maxa za d3d format.

Evo koda:

/*
#define WRITE_MATRIX4_FROM_MATRIX3(pbCur, _matrix3) {\
Point3 __tempRow = ((Matrix3)_matrix3).GetRow(0); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(2); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(1); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 0);\
__tempRow = _matrix3.GetRow(3); WRITE_POINT3_MODIFIKOVANO(pbCur, __tempRow); WRITE_FLOAT(pbCur, 1);}

Ovo sto je u komentaru je stara verzija a ovo MODIFIKOVANO je nova koja to radi kako treba. Obrati pzanju na _matrix3.GetRow(...) i bice ti jasno, samo prebaci da Row idu sledecim redosledom 2,1,3 umjesto 1,2,3.

poz


Probao sam i nije dalo rezultate. Nisam ni uspeo da provalim gde kamera gleda.

Kako si transformisao vertekse iz RH u LH ?
Kako si transformisao quaternione za rotaciju ?
[ eva01 @ 10.04.2005. 22:41 ] @
Citat:
reject: Ne zelim da mutim vodu, ali zasto ne koristis .X i
za meheve i za animacije? Max moze da ga exportuje.


Nema nekog narucitog razloga. Ranije sam radio sa ASE-om pa sam i sad hteo da ga upotrem. Verovatno mi je bilo pametnije da se odmah preorjentisem na X. Ipak ovde se vise radi o konverziji iz RH u LH sistem tako da to nije ni bitno.
[ yooyo @ 12.04.2005. 15:47 ] @
Nije samo konverzija iz RH u LH problem. U pitanju je i glupavi MAX. OpenGL i D3D pretpostavljaju da je X osa horizontalna na ekranu, Y osa vertikalna, a Z osa prolazi kroz ekran. MAX ima drugaciji sistem, tj kod njega je Z osa vertikalna, a Y prolazi kroz ekran.

Resenje je da prvo transformises MAX-ov sistem u normalni pa tek onda da prebacujes iz RH u LH. U tvom slucaju posle rotacije oko X ose za 90 stepeni, Y osa pokazuje vertikalno na gore, X osa horizontalno na desno a Z osa ka posmatracu. Sada invertuj Z osu u matrici i dobices LH sistem.

ps.. Nisam 100% siguran da li je ovo OK... ali te nista ne kosta da probas. :)

yooyo
[ eva01 @ 12.04.2005. 19:56 ] @
Izgleda da je to bilo u pitanju... Ustvari resio sam ovo malo pre tvog post-a ali tako sto sam rotaciju oko X ose dodao naknadno u matricu kamere (koju sam generisao a ne preuzeo iz max-a tj. ase-a) ali nije mi bilo jasno zasto je to potrebno.

Ustvari mislim da je nikbab-ov predlog bio ok. tj. radio je istu stvar (zamena 2 i 3 reda je isto kao zamena transformacija za z i y osu - ako lupam nek me neko ispravi) ali ja sam pograsno shvatio da je to potrebno uraditi na max-ovoj RH matrici.
[ Nothingman @ 12.04.2005. 23:09 ] @
Hm, ja sam imao isti problem kad sam se nedavno zezao sa Quake 3 mapama i modelima. U Quake-u X-osa je horizontalna (smer na desno), Y-osa prolazi kroz ekran (smer prema tebi), Z-osa je vertikalna (smer na dole).
Iz ovog sto je yooyo napisao vidim da max i quake imaju izgleda isti koordinatni sistem (pitanje je samo da li je smer osa isti, dok je pravac identican).
Ja sam problem resio na sledeci nachin:
da bih izbegao te rotacije celo vreme dok se izvrsava program, za vreme startup-a sam jednim prolazom kroz sve vertexe, normale... swapovao njihove koordinate na sledeci nachin:
Code:

void Swap(VECTOR* v)
{
double tmp = v.y;
v.y = v.z;
v.z = -tmp;
}

Ovim sam transformisao quake koordinatni sistem u OpenGL koordinatni sistem.
Znachi ako je smer osa u max-u takav kakav sam gore opisao onda mozes koristiti ovu funkciju da ovavi posao, a ako nije onda je mozes na trivijalan nacin prilagoditi svojim potrebama.

Uvek sam se pitao zasto quake koristi tako glup koordinatni sistem i evo citajuci ovaj topic sam shvatio da nisu jedini...
Ili su mozda koristili max dok su pravili igru ;)
[ eva01 @ 13.04.2005. 13:31 ] @
Citat:
eva 01: Izgleda da je to bilo u pitanju... Ustvari resio sam ovo malo pre tvog post-a ali tako sto sam rotaciju oko X ose dodao naknadno u matricu kamere .


Mala ispravka, rotacija oko X ose za 90 stepeni je prva view transformacija tj. bas kao sto je yooyo predlozio (zaboravio sam na inverziju redosleda mnozenja matrica za view transformaciju).