A transzformációs mátrix (elmélet és gyakorlat) |
Írta Kaproncai Tamás [tomcat@szif.hu] |
A dokumentum szöveges verziója: TMATRIX.TXT
Ha adott egy vektor (P
) és egy transzformációs mátrix (M
),
akkor a kettő összeszorzását kétféle módon is elvégezhetjük:
- P'= M * P (P-t oszlopvektornak értelmezem).
[ x ]
[ y ]
[ a b ] [ ax+by ]
[ c d ] [ cx+dy ]
- P'= P * M (P-t sorvektornak értelmezem).
[ a b ]
[ c d ]
[ x y ] [ ax+cy bx+dy ]
Vizsgáljuk meg a szorzást térben 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 ]
Látható, hogy a mátrix átlójának elemei (a,e,i
) mindkét esetben azonos helyre
kerülnek. A főátló alatti ill. feletti elemek pedig szerepet cserélnek.
Ez azt jelenti, hogy ha a transzformációs mátrix sorait felcserélem az oszlopaival (transzponálom), akkor a szorzás után ugyanazt az eredményt kapom mint az elöző 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 ]
Tehát összefoglalva:
Ha valaki visszalapoz a szorzásokhoz, akkor láthatja, hogy az oszlopvektoros felírás jóval tömörebb. Ezért a továbbiakban minden transzformációs mátrixom ilyen lesz és így oszlopvektorokra értelmezendő.
Ez azt is jelenti, hogy ha valakinek olyan transzformációs mátrixa van, amely az enyémnek a transzponáltja, akkor az a mátrix sorvektorokra értelmezett.
A mátrix elemei dupla pontosságú lebegőpontos számok, amiket sorfolytonosan fogok letárolni (mint a képernyőn a pixelek adatait).
Nezzük a gyakorlati megvalósítást a TASM
szintaktikáját használva:
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 megjegyzés rovatban két oszlop található, ez egyik azt mutatja, hogy az
adott utasítás mely gépi ciklusok alatt fut, a másik oszlop pedig az FPU
vermének tartalmát követi nyomon.
A rutin futási ideje a visszaírással együtt 31 ciklus, annélkül pedig 24.
Amennyiben ez a rutin még nincs benne a kódot gyorsító tárban, akkor a
futási ideje 2 ciklussal nő a 2 db FXCH
miatt.
Valószínűleg ezt a térbeli transzformációt nem csak egy darab, hanem egyszere sok vektorra szeretnénk elvégezni. Ezt a leggyorsabban így tehetjük:
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]
Így az iteráció adminisztrációja csak 1 ciklus ideig tart, és ez az 1 ciklus
is az FSTP
utasítások előtti holt időben foglal helyett. Ez azt jelenti, hogy
átlagosan 31 gépi ciklus alatt lehet a leggyorsabb egy 3x3 transzformációt
elvégezni a Pentium alapú számítógépeken.
Íme a teljes példaprogram NASM
szintaxissal:
TMATRIX.ASM