CannibalSmith ([info]cannibalsmith) rakstīja [info]koderi kopienā,
@ 2008-08-28 15:14:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
3D transformāciju matricas
Kā zināms, 3D koordinātas ir vektori (x, y, z, h), kur h = 1, un transformāciju matricas ir
a b c p
e f g q
i j k r
l m n s
, kur abcdefgijk ir rotācija, un lmn ir pārvietojums. Mēs iegūstam attēlu transformējot visus scēnas punktus uz kameras koordinātu sistēmu un projicējot tos uz ekrāna:
x_uz_ekrāna = puse_ekrāna_platuma + x / z
y_uz_ekrāna = puse_ekrāna_augstuma - y / z
.

Mans jautājums ir: ko dara ar hpqrs mainīgajiem?


(Ierakstīt jaunu komentāru)


[info]barvins
2008-08-28 16:46 (saite)
Neesmu iedziļinājies, varbūt galīgi diršu, bet iespējams, ka tie mainīgie kaut ko maina tikai ceturtajā dimensijā, bet tā kā runa ir par 3D grafiku un reāli no rezultāta izmanto tikai 3 dimensijas, tad tie mainīgie neko neietekmē.
Cik sapratu, tad katru transformāciju atsevišķi var izpildīt ar 3x3 matricu, bet, lai sabāztu visa veida transformācijas vienā matricā, tiek mākslīgi pielikta klāt vēl viena dimensija.
http://home10.inet.tele.dk/moelhave/tutors/3d/transformations/transformations.html#SECTION0003000000000000000000

(Atbildēt uz šo)


[info]bubu
2008-08-28 19:05 (saite)
Ar transformācijas matricu transformē vektoru. Tavā gadījumā vektors (x,y,z,h) izmantojot to tavu abc.. matricu transformēsies par vektoru (X,Y,Z,H), kur:
X = a*x + b*y + c*z + p*h
Y = e*x + f*y + g*z + q*h
Z = i*x + j*y + k*z + r*h
H = l*x + m*y + n*z + s*h
Kā redzi šeit ir izmantoti visi abc..mns "burti".

Tas, ko tu uzrakstīji sapin vienā putrā divas lietas - 3d transformāciju (rotāciju + translāciju) un projekcijas matricu.

3d transformāciju matricām vienmēr p=q=r=0 un h=s=1. Tāpēc, lai "nesačakarētu" 4d vektoru būtību 3d telpā.
Vēl jo vairāk - 3d rotācijas matricām l=m=n=p=q=r=0. Un tikai translācijai l=m=n var nebūt 0.
Vēl svarīga lieta ir h vērtība. Ja tā ir 0, tad (x,y,z) nozīmē vektoru 3d telpā (virzienu). Ja tā ir 1, tad (x,y,z) nozīmē punktu 3d telpā. Palasi par homogēnām koordinātēm. Citām h vērtībām īsti lielas jēgas nav.
Paskaties pats uz augstāk esošajiem vienādojumiem. Ja h=0, tad l/m/n neietekmēs X/Y/Z vērtības - visai loģiski, jo pārbīdod vektoru tā virziens nemainās. Savukārt, ja h=1, ta l/m/n vērtības ir vienkārši piessumētas X/Y/Z formulās - arī visai loģiski. Parbīdot punktu, tā koordinātēm vienkārši ir jāpieskaita izmaināmās vērtības (l/m/n).
Var ari domāt, ka 3d punktu (h!=0) no (x,y,z,h) koordinātēm dabū pēc formulas (x/h,y/h,z/h). Kā redzams, šis nemaina parasta punkta pirmos trīs komponentus (jo h=1).

projekcijas matricām, savukārt, p/q/r/s elementi var nebūt 0 vai 1 (atkarībā no izmantotās projekcijas veida -dimetrija, perspektīva, ...). Tie ir atšķirīgi no tāpēc, lai h vērtība ietekmētu X/Y/Z vērtības (skat izteiksmes augstāk).

Un nevajag uz a,b,c,e,f,g,i,j,k vērtībām skatīties kā uz brīnumu skaitļiem kā rotācijas matricā. Uz tiem vajag skatīties kā jaunās koordināšu sistēmas (pagrieztās) bāzēm izteiktiem ar veco koordināšu sistēmas (nepagrieztās) bāzēm.

(Atbildēt uz šo) (Diskusija)


[info]barvins
2008-08-28 20:03 (saite)
Hmm, pēc tiem vienādojumiem sanāk, ka l,m,n,s ietekmē tikai H, līdz ar to ir pofig, kādas ir to vērtības, ja mūs interesē tikai 3D telpa. p,q, un r gan kaut ko ietekmē, ja h nav 0 (tā būs tā translācija).

(Ka tik tie vienādojumi nav atkarīgi no tā, vai xyzh vektoru uzraksta horizontāli vai vertikāli. Tas reizinājums varēja būt arī šitā:
X = a*x + e*y + i*z + l*h
...
)

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]bubu
2008-08-28 21:00 (saite)
vai xyzh vektoru uzraksta horizontāli vai vertikāli

jap, tev tiesa. Pats saputrojos.
Man neitīvais ir OpenGL pieraksts (column major).

(Atbildēt uz šo) (Iepriekšējais)


[info]cannibalsmith
2008-08-28 20:30 (saite)
Bet kur man tā projekcijas matrica noder? Ja manis aprakstītie soļi 3D perspektīvai uz ekrāna ir pareizi, tad sanāk, ka viņa nemaz nav vajadzīga.

Un kā tas viss saistās ar field of view leņķi?

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]bubu
2008-08-28 21:09 (saite)
field of view leņķis ir ietvers projekcijas matricu skaitļos iekšā.
Skat, piemēram, kā OpenGL uzkonstruē projekcijas matricu no inputa (fov, aspectRatio, zNear, zFar): http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml
Reku vēl ko palasīt: http://msdn.microsoft.com/en-us/library/bb147302.aspx

Projekcijas matrica kā tāda noder aprēķinu vienkāršošanai, ar to var kontrolēt, piemēram, tavis prasīto field of view. Kā arī kontrolēt projekcijas veidu vai tās parametrus. Projekcijas veidi ir daudz un dažādi: http://en.wikipedia.org/wiki/Graphical_projection

Tā vietā, lai darītu divus dažādus aprēķinus punkta projicēšanai: 1) punkts no pasaules koordināšu sistēmas uz kameras koordināšu sistēmu (View matrix) un 2) no kameras koordināšu sistēmas uz ekrāna koordināšu sistēmu (Projection matrix). būtu vienkāršāk (un efektīvāk) izrēķināt vienu matricu (View * Projection) un transformēt punktu tikai ar šo vienu matricu.

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?