Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 5.068 pregleda

Najnovija ↓

max-ov koordinatni sistem i kamera 09.04.2005. u 15:49 · pre 262 meseca #1
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).
Re: max-ov koordinatni sistem i kamera 10.04.2005. u 09:31 · pre 262 meseca #2
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
Re: max-ov koordinatni sistem i kamera 10.04.2005. u 23:39 · pre 262 meseca #4
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 ?
Re: max-ov koordinatni sistem i kamera 10.04.2005. u 23:41 · pre 262 meseca #5
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.
Re: max-ov koordinatni sistem i kamera 12.04.2005. u 16:47 · pre 262 meseca #6
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
Re: max-ov koordinatni sistem i kamera 12.04.2005. u 20:56 · pre 262 meseca #7
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.
Re: max-ov koordinatni sistem i kamera 13.04.2005. u 00:09 · pre 262 meseca #8
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 ;)
Potpis
Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
Re: max-ov koordinatni sistem i kamera 13.04.2005. u 14:31 · pre 262 meseca #9
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).
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme