A transzformacios matrix (elmelet es gyakorlat) Irta Kaproncai Tamas [tomcat@szif.hu] Transzformacios matrix (elmelet) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ha adott egy vektor (P) es egy transzformacios matrix (M), akkor a ketto osszeszorzasat ketfele modon is elvegezhetjuk: P'= M * P (P-t oszlopvektornak ertelmezem). [ x ] [ y ] [ a b ] [ ax+by ] [ c d ] [ cx+dy ] P'= P * M (P-t sorvektornak ertelmezem). [ a b ] [ c d ] [ x y ] [ ax+cy bx+dy] Lathato, hogy a ket eredmeny nem ugyanaz a vektor. - Akkor most hogyan kell osszeszorozni oket? - Melyik a helyes? Vizsgaljuk meg a szorzast terben is: [ a b c ] [ x ] [ ax+by+cz ] P'= M * P = [ e f g ] * [ y ] = [ dx+ey+fz ] [ h i j ] [ z ] [ gx+hy+iz ] [ x ] [ y ] [ z ] [ a b c ] [ ax+by+cz ] [ d e f ] [ dx+ey+fz ] [ g h i ] [ gx+hy+iz ] [ a b c ] P'= P * M = [ x y z ] * [ d e f ] = [ ax+dy+gz bx+ey+hz cx+fy+iz ] [ g h i ] [ a b c ] [ d e f ] [ g h i ] [ x y z ] [ ax+dy+gz bx+ey+hz cx+fy+iz ] Az eredmeny itt is kulonbozik. Lathato, hogy a matrix atlojanak elemei (a,e,i) mindket esetben azonos helyre kerulnek. A foatlo alatti ill. feletti elemek pedig szerepet cserelnek. Ez azt jelenti, hogy ha a transzformacios matrix sorait felcserelem az oszlopaival (transzponalom), akkor a szorzas utan ugyanazt az eredmenyt kapom mint az elozo esetben. T [ a d g ] P'= P * M = [ x y z ] * [ b e h ] = [ ax+by+cz dx+ey+fz gx+hy+iz ] [ c f i ] [ a d g ] [ b e h ] [ c f i ] [ x y z ] [ ax+by+cz dx+ey+fz gx+hy+iz ] Tehat osszefoglalva: - tudnom kell, hogy a megadott transzformacios matrix oszlop- vagy sorvektorokra ad-e helyes eredmenyt. - de magat a szorzast mindket modon elvegezhetem, legfeljebb a matrix transzponaltjaval szamolok, ami a gyakorlatban csak annyit jelent, hogy az elemeket mas sorrendben szolitom meg. Transzformacios matrix (gyakorlat) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ha valaki visszalapoz a szorzasokhoz, akkor lathatja, hogy az oszlopvektoros feliras joval tomorebb. Ezert a tovabbiakban minden transzformacios matrixom ilyen lesz es igy oszlopvektorokra ertelmezendo. Ez azt is jelenti, hogy ha valakinek olyan transzformacios matrixa van, amely az enyemnek a transzponaltja, akkor az a matrix sorvektorokra ertelmezett. A matrix elemei dupla pontossagu lebegopontos szamok, amiket sorfolytonosan fogok letarolni (mint a kepernyon a pixelek adatait). Nezzuk a gyakorlati megvalositast a TASM szintaktikajat hasznalva: STRUC Vec3 x DQ ? y DQ ? z DQ ? ENDS STRUC Mat33 m1 Vec3 ? m2 Vec3 ? m3 Vec3 ? ENDS MACRO M33x13 T,S,D FLD [T.m3.x];;01-01 g FMUL [S.x] ;;02-04 gx FLD [T.m2.x];;03-03 d gx FMUL [S.x] ;;04-06 dx gx FLD [T.m1.x];;05-05 a dx gx FMUL [S.x] ;;06-08 ax dx gx FLD [T.m1.y];;07-07 b ax dx gx FMUL [S.y] ;;08-10 by ax dx gx FLD [T.m2.y];;09-09 e by ax dx gx FMUL [S.y] ;;10-12 ey by ax dx gx FLD [T.m3.y];;11-11 h ey by ax dx gx FMUL [S.y] ;;12-14 hy ey by ax dx gx FXCH ST(2) ;;13-13 by ey hy ax dx gx FADDP ST(3),ST;;13-15 ey hy ax+by dx gx FADDP ST(3),ST;;14-16 hy ax+by dx+ey gx FADDP ST(3),ST;;15-17 ax+by dx+ey gx+hy FLD [T.m1.z];;16-16 c ax+by dx+ey gx+hy FMUL [S.z] ;;17-19 cz ax+by dx+ey gx+hy FLD [T.m2.z];;18-18 f cz ax+by dx+ey gx+hy FMUL [S.z] ;;19-21 fz cz ax+by dx+ey gx+hy FLD [T.m3.z];;20-20 i fz cz ax+by dx+ey gx+hy FMUL [S.z] ;;21-23 iz fz cz ax+by dx+ey gx+hy FXCH ST(2) ;;22-22 cz fz iz ax+by dx+ey gx+hy FADDP ST(3),ST;;22-24 fz iz ax+by+cz dx+ey gx+hy FADDP ST(3),ST;;23-25 iz ax+by+cz dx+ey+fz gx+hy FADDP ST(3),ST;;24-26 ax+by+cz dx+ey+fz gx+hy+iz IFNB FSTP [D.x] ;;26-27 dx+ey+fz gx+hy+iz FSTP [D.y] ;;28-29 gx+hy+iz FSTP [D.z] ;;30-31 ENDIF ENDM A megjegyzes rovatban ket oszlop talalhato, ez egyik azt mutatja, hogy az adott utasitas mely gepi ciklusok alatt fut, a masik oszlop pedig az FPU vermenek tartalmat koveti nyomon. A rutin futasi ideje a visszairassal egyutt 31 ciklus, annelkul pedig 24. Amennyiben ez a rutin meg nincs benne a kodot gyorsito tarban, akkor a futasi ideje 2 ciklussal no a 2 db FXCH miatt. Valoszinuleg ezt a terbeli transzformaciot nem csak egy darab hanem egyszere sok vektorra szeretnenk elvegezni. Ezt a leggyorsabban igy tehetjuk: MOV ESI,OFFSET Forras + Darab * SIZE Vec3 MOV EDI,OFFSET Cel + Darab * SIZE Vec3 MOV ECX,-1 * Darab * SIZE Vec3 JMP First Next: FSTP [EDI+ECX.x] FSTP [EDI+ECX.y] FSTP [EDI+ECX.z] First: M33x13 Matrix,ESI+ECX ADD ECX,SIZE Vec3 JNZ Next FSTP [EDI+ECX.x] FSTP [EDI+ECX.y] FSTP [EDI+ECX.z] Igy az iteracio adminisztracioja csak 1 ciklus ideig tart, es ez az 1 ciklus is az FSTP utasitasok elotti holt idoben foglal helyett. Ez azt jelenti, hogy atlagosan 31 gepi ciklus alatt lehet a leggyorsabb egy 3x3 transzformaciot elvegezni a Pentium alapu szamitogepeken. Ime a teljes peldaprogram NASM szintaxissal: struc V3 x: RESQ 1 y: RESQ 1 z: RESQ 1 endstruc struc M33 .11: RESQ 1 .12: RESQ 1 .13: RESQ 1 .21: RESQ 1 .22: RESQ 1 .23: RESQ 1 .31: RESQ 1 .32: RESQ 1 .33: RESQ 1 endstruc %macro M33x13 2 FLD QWORD [%1+M33.31];;01-01 g FMUL QWORD [%2+x] ;;02-04 gx FLD QWORD [%1+M33.21];;03-03 d gx FMUL QWORD [%2+x] ;;04-06 dx gx FLD QWORD [%1+M33.11];;05-05 a dx gx FMUL QWORD [%2+x] ;;06-08 ax dx gx FLD QWORD [%1+M33.12];;07-07 b ax dx gx FMUL QWORD [%2+y] ;;08-10 by ax dx gx FLD QWORD [%1+M33.22];;09-09 e by ax dx gx FMUL QWORD [%2+y] ;;10-12 ey by ax dx gx FLD QWORD [%1+M33.32];;11-11 h ey by ax dx gx FMUL QWORD [%2+y] ;;12-14 hy ey by ax dx gx FXCH ST2 ;;13-13 by ey hy ax dx gx FADDP ST3,ST0 ;;13-15 ey hy ax+by dx gx FADDP ST3,ST0 ;;14-16 hy ax+by dx+ey gx FADDP ST3,ST0 ;;15-17 ax+by dx+ey gx+hy FLD QWORD [%1+M33.13];;16-16 c ax+by dx+ey gx+hy FMUL QWORD [%2+z] ;;17-19 cz ax+by dx+ey gx+hy FLD QWORD [%1+M33.23];;18-18 f cz ax+by dx+ey gx+hy FMUL QWORD [%2+z] ;;19-21 fz cz ax+by dx+ey gx+hy FLD QWORD [%1+M33.33];;20-20 i fz cz ax+by dx+ey gx+hy FMUL QWORD [%2+z] ;;21-23 iz fz cz ax+by dx+ey gx+hy FXCH ST2 ;;22-22 cz fz iz ax+by dx+ey gx+hy FADDP ST3,ST0 ;;22-24 fz iz ax+by+cz dx+ey gx+hy FADDP ST3,ST0 ;;23-25 iz ax+by+cz dx+ey+fz gx+hy FADDP ST3,ST0 ;;24-26 ax+by+cz dx+ey+fz gx+hy+iz %endmacro %macro M33x13 3 M33x13 %1,%2 FSTP QWORD [%3+x] ;;26-27 dx+ey+fz gx+hy+iz FSTP QWORD [%3+y] ;;28-29 gx+hy+iz FSTP QWORD [%3+z] ;;30-31 %endmacro Darab EQU 10 ORG 100H FNINIT MOV ESI,Forras + Darab * V3_size MOV EDI,Cel + Darab * V3_size MOV ECX,-1 * Darab * V3_size JMP SHORT First Next: FSTP QWORD [EDI+ECX+x] FSTP QWORD [EDI+ECX+y] FSTP QWORD [EDI+ECX+z] First: M33x13 Matrix,ESI+ECX ADD ECX,V3_size JNZ Next FSTP QWORD [EDI+ECX+x] FSTP QWORD [EDI+ECX+y] FSTP QWORD [EDI+ECX+z] MOV AX,4C00H INT 21H SEGMENT .bss ALIGNB 8 Matrix RESB M33_size Forras RESB Darab * V3_size Cel RESB Darab * V3_size