2D visualisering 2D-windowing pijplijn Clipping Normalisatie

advertisement
Clipping
The action of truncating data or an image by removing all the display
elements that lie outside a boundary
2D visualisering
Creatie van een voorstelling van een 2D of 3D tafereel met behulp van
ywmax
clipping window
viewport
yvmax
• geometrische primitieven
• 2D of 3D-modeltransformaties
De reële afmetingen: van zeer klein tot zeer groot
yvmin
ywmin
Omzetting naar een afbeelding op het computerscherm
xwmin
xvmin
xwmax
xvmax
Het clipping window wordt vaak in wereldcoördinaten uitgedrukt (WC = VC).
Normalisatie
2D-windowing pijplijn
Projectie van het clipping window op een genormaliseerd vierkant:
model
transformaties
Modelering van de scène in wereldcoördinaten
ywmax
normalisatie
1
Berekening (xn , yn )
(xw , yw )
WC
clipping
clipping window
Aflijnen van een twee-dimensionale view: alle objecten buiten het clipping-window: niet zichtbaar
(xn , yn )
ywmin
-1
1
VC
normalisatie
NC
viewport
transformatie
DC
Alle coördinaten worden genormaliseerd naar bijvoorbeeld een eenheidsvierkant
De genormaliseerde 2D-grafiek wordt gemapt op het
display-window.
xwmin

 x =s ×x +t
x
w
x
n
 yn = sy × yw + ty
xwmax

 s =
x
met
 sy =
xn −(−1)
1−(−1)
yn −(−1)
1−(−1)
=
=
xw −xwmin
xwmax −xwmin
yw −ywmin
ywmax −ywmin
-1
2
xwmax −xwmin
2
ywmax −ywmin
( een schaling gevolgd door een translatie )

 t =
x
en
 ty =
−xwmax −xwmin
xwmax −xwmin
−ywmax −ywmin
ywmax −ywmin
Viewport
Homogene coördinaten
Van de genormaliseerde scène naar het actieve window op het scherm:
Stelling:
normalisatie
1
viewport
yvmax
Berekening (xv , yv )
(xv , yv )
(xn , yn )
-1
1
xvmin
-1

 x = s′ × x + t′
n
v
x
x
 yv = s′ × yn + t′
y
xv −xvmin
xvmax −xvmin
yv −yvmin
yvmax −yvmin
yvmin
y

 s′ =
x
met
 s′ =
y
=
=
xn −(−1)
1−(−1)
yn −(−1)
1−(−1)
xvmax
xvmax −xvmin
2
yvmax −yvmin
2
( een schaling gevolgd door een translatie )
een probleem in een n-dimensionale ruimte heeft telkens een overeenkomstig probleem in een (n + 1) dimensionale ruimte
Vaststelling:
de oplossing van een probleem in de ruimte met dimensie (n + 1)
is vaak eenvoudiger te bekomen dank zij de extra vrijheidsgraad
De oplossing in de (n + 1)-dimensionale ruimte kan dan op de één of andere
manier geprojecteerd worden naar de ruimte met dimensie n.
Homogeniseren van een punt met twee coördinaten (x, y): toevoegen van een
derde coördinaat w 6= 0, de schaalfactor.

 t′ =
x
en
 t′ =
y
xvmax +xvmin
2
yvmax +yvmin
2
Het punt wordt nu bepaald door drie coördinaten: (wx, wy, w).
Projectie van een punt (16, 8, 4): (16/4, 8/4) of (4, 2).
3D: punt (x, y, z) homogeniseren: schaalfactor toevoegen (x, y, z, 1)
Coördinaten transformaties mbv. homogene coördinaten
Matrix notatie
• wereldcoördinaten naar genormaliseerde coördinaten
#
# "
#"
# "
"
tx
xw
sx 0
xn
+
=
ty
yw
0 sy
yn
• genormaliseerde coördinaten naar schermcoördinaten
"
# "
#"
#
# "
xv
s′x 0
xn
t′x
=
+
yv
0 s′y
yn
t′y
zowel een matrix vermenigvuldiging als een optelling:
kan niet efficiënt door de grafische processor berekend worden
Punt: een 3 × 1 kolommatrix
transformatiematrix: een 3 × 3 matrix
• wereldcoördinaten naar genormaliseerde coördinaten
i
i h
ih
i h
h
xn
yn

=

0
sx
0

xw
yw
sy
sx
0

 
 yn  =  0

 
0
1
sy
xn
0
tx
+

tx
ty
xw





ty 
  yw 
1
1
• genormaliseerde coördinaten naar schermcoördinaten



 
xn
xv
s′
0 t′x



  x
 yv  =  0 s′ t′   yn 
y 
y


 
1
0 0 1
1
window-to-viewport transformatie
Schermcoördinaten ← genormaliseerde coördinaten ← wereld coördinaten
 


xvmax −xvmin
min
xv
0 xvmax +xv
2
2
 


yvmax +yvmin 
 yv  = 
min
0 yvmax −yv
 


2
2
1
0
0
1

 

xwmax +xwmin
2
xw
0 − xw
xwmax −xwmin
max −xwmin

 

ywmax +ywmin 
2

× 
×
− yw
0 ywmax −yw
 yw 

min
max −ywmin 
1
0
0
1



xv
 

 yv  = 
 

1
xvmax −xvmin
xwmax −xwmin
0
0
yvmax −yvmin
ywmax −ywmin
0
0
xwmax xvmin −xwmin xvmax
xwmax −xwmin
ywmax yvmin −ywmin yvmax
ywmax −ywmin


xw


  yw 


1
1
2D viewing transformatie in OpenGL
1. selecteren van de juiste matrixmode: glMatrixMode(GL PROJECTION);
de top-of-stack van de projectiematrix-stack wordt de actieve matrix
de default-waarde is de eenheidsmatrix;
na wijzigen van de projectparameters kan terug de eenheidsmatrix
geladen worden:
glLoadIdentity();
2. definitie van een tweedimensionaal clipping window:
gluOrtho2D( GLdouble l e f t , GLdouble r i g h t ,
GLdouble bottom , GLdouble top ) ;
left (xwmin ), right (xwmax ), bottom (ywmin ), top (ywmax )
3. bepalen van transformatie van genormaliseerde naar schermcoördinaten:
g l V i e w p o r t ( GLint x , GLint y , GLint b reed , GLint hoog ) ;
x (xvmin ), y (yvmin ), breed (xvmax − xvmin ), hoog (yvmax − yvmin )
Voorbeeld
glViewport (0 , 0 , 600 , 4 0 0 ) ;
gluOrtho2D( −2.5 , 2 . 5 , −1.0 , 3 . 0 ) ;




120
0
0
0
300


100 100 

0
1

420.0
←



 200.0 


1.0

300



←
0
0
0
300


200 200 

0
1

0.4



 0.0 


1.0




0.4
0
0
←
0
0


0.5 −0.5 

0
1

1.0



 1.0 


1.0
Download