Homogenisering
Grafikk
Børre Stenseth
Matematikk>Homogenisering

Homogenisering av koordinater

Hva

I modulene 2D transf. og 3D transf. fant vi at vi kunne finne en felles matriseform for de grunnleggende geometriske operasjonene ved å innføre en 3.koordinat i planet og en 4.koordinat i rommet.

Vi sa at vi innførte homogene koordinater og tilla ikke den ekstra koordinaten noen betydning, verken geometrisk eller matematisk. Vi skal se litt nærmere på denne kunstige koordinaten og bruken av den i denne modulen.

Når vi innførte homogene koordinater var det for at vi skulle kunne multiplisere likeartede matriser for på den måten å oppnå den kombinerte geometriske effekten. I rommet fant vi fram til følgende sentrale 4x4 matriser:

Identitetsmatrisa
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1    
Translasjon
1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1     
Skalering
sx 0 0 0
0 sy 0 0
0 0 sz 0
0 0  0 1    
Rotasjon om z
cos -sin 0 0
sin cos  0 0
0   0    1 0
0   0    0 1    
Rotasjon om y
cos  0 sin  0
0    1  0   0
-sin 0 cos  0
0    0  0   1    
Rotasjon om x
1 0     0   0
0 cos  -sin 0
0 sin  cos  0
0  0    0   1    

Det er normalt disse matrisene vi bruker når vi setter opp transformasjoner i modellene våre. Selv om rotasjonskommandoen i OpenGL er generalisert og kopler vinkel og rotasjonsakse, så er resultatet en kombinasjon av matrisene ovenfor.

Felles for alle disse matrisene og de matrisene vi får ved å multiplisere dem er at de har formen:

|a11  a12  a13  a14 |
|a21  a22  a23  a24 |
|a31  a32  a33  a34 |
| 0     0    0    W |    

der W alltid har verdien 1.

Hva dersom vi lager en matrise der W er forskjellig fra 1?

I enkelte sammenhenger er det nyttig å beregne en egen matrise og bruke denne direkte enten ved å sette den som OpenGLs aktuelle transformasjonsmatrise eller ved å multiplisere den til den aktuelle transformasjonsmatrisa. OpenGL har kommandoer for å gjøre begge disse operasjonene:

   glLoadMatrixd(...)
   glMultMatrixd(...)
 

Når OpenGL transformerer et punkt skjer det alltid en "homogenisering" av resultatet. Det betyr at koordinatverdiene divideres med W. Vi ser på en translasjon som eksempel:

        |1 0 0 a| |x| |x+a|
P'=M*P =|0 1 0 b|*|y|=|y+b|
        |0 0 1 c| |z| |z+c|
        |0 0 0 W| |1| |W  |
 

og homogenisert:

|(x+a)/W|
|(y+b)/W|
|(z+c)/W|
|1      |
 
offset De 2 kodebitene (GL4Java syntaks)
nedenfor produserer begge samme figur:
drawSquare(red);
gl.glTranslated(2.0,2.0,0.0);
drawSquare(blue);
drawSquare(red);
double M_mult[]={
2.0,  0.0,  0.0,  0.0,
0.0,  2.0,  0.0,  0.0,
0.0,  0.0,  2.0,  0.0,
4.0,  4.0,  0.0,  2.0
};
gl.glMultMatrixd(M_mult);
drawSquare(blue);

Merk transponeringen av matrisen i forhold til oppsettet ovenfor.

[1] [2]
Referanser
  1. The OpenGL Programming Guide, 6 editionDave Schreiner, Mason Woo,Jackie Neider,Tom Davies2007Addison-Wesley Professional0321481003www.opengl.org/documentation/red_book/14-03-2010
  1. Computer Graphics: Principles and Practice in C (2nd Edition)James Foley, Andries van Dam, Steven K.Feiner, John F. Hughes1995Addison-Wesley0201848406
Vedlikehold
  • 2002, Børre Stenseth
Matematikk>Homogenisering
til toppen