4:
Janelas, Visores &
Recorte Grfico
Sumrio
Definies bsicas: sistema de coordenadas globais, sistema de
coordenadas do ecr; janela de domnio de cena; janela de
interface e visores de sada grfica.
Transformao janela-visor
Transformao janela-visor OpenGL
Serializador do processo de renderizao
Serializador do processo de renderizao 2D em OpenGL
Recorte de segmentos de recta: algoritmo de Cohen-Sutherland
Recorte de polgonos
Recorte no serializador OpenGL
Definies ecr
janela de janela
interface do ecr
janela de dominio HOUSE CLIP
da cena
visor
(umin,vmin)
(xmin,ymin) x x u u
janela em
janela
coordenadas janela com visor transladado por
transladada
globais tamanho alterado (umin,vmin)
para a
(ou de domnio igual ao tamanho do visor para a posio final
origem
de cena)
umax umin vmax vmin
S( , )
T (xmin ,ymin ) xmax xmin ymax ymin T (umin ,vmin )
Transformao Janela-Visor:
representao matricial v
y y v
(umax,vmax)
(xmax,ymax)
(umin,vmin)
(xmin,ymin) x x u u
umax umin vmax vmin
S( , )
T (xmin ,ymin ) xmax xmin ymax ymin T (umin ,vmin )
x xmin u umin u u
= u = (x xmin ). max min + umin
x xmax xmin umax umin xmax xmin u
umax
xmin xmax umin
ymax vmax
y ymin v vmin v v
y = v = (y ymin ). max min + vmin
ymax ymin vmax vmin ymax ymin v
ymin vmin
Transformao Janela-Visor:
exemplo v
y
(umax,vmax)
(xmax,ymax)
(umin,vmin)
(xmin,ymin) x u
janela(10.0,2.0,40.0,30.0) visor(100,50,250,300)
300 50 300 50
v = (y 5.0). + 50 y = = 10.0
30.0 5.0 30.0 5.0
Transformao Janela-Visor:
em OpenGL
gluOrtho2D(left, right, bottom, top)
Define uma regio de visualizao ortogonal 2D ou janela de domnio de cena.
definida por dois planos verticais de recorte left e right e dois planos horizontais de
recorte bottom e top.
Modelview Projection
Vertex Viewport
Matrix Matrix
void draw(){
// Make background colour yellow
glClearColor( 100, 100, 0, 0 );
glClear ( GL_COLOR_BUFFER_BIT );
// display rectangles
glutSwapBuffers();
} // end of draw()
Exemplo 1:
visor por defeito (cont.)
// Keyboard method to allow ESC key to quit
void keyboard(unsigned char key,int x,int y)
{
if(key==27) exit(0);
}
glViewport(x,y, width,height).
// display rectangles
glutSwapBuffers();
} // end of draw()
Exemplo 2:
1 visor (cont.)
// Keyboard method to allow ESC key to quit
void keyboard(unsigned char key,int x,int y)
{
if(key==27) exit(0);
}
void draw(){
// Make background colour yellow
glClearColor( 100, 100, 0, 0 );
glClear ( GL_COLOR_BUFFER_BIT );
// Sets up FIRST viewport spanning the left-bottom quarter of the interface window
glViewport(0,0,250,250);
// Sets up the PROJECTION matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,50.0,-10.0,40.0); // also sets up world window
// Sets up SECOND viewport spanning the right-top quarter of the interface window
glViewport(250,250,250,250);
// Sets up the PROJECTION matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,50.0,-10.0,40.0); // also sets up world window
// display rectangles
glutSwapBuffers();
} // end of draw()
Exemplo 3:
2 visores (cont.)
// Keyboard method to allow ESC key to quit
void keyboard(unsigned char key,int x,int y)
{
if(key==27) exit(0);
}
Zooming
Reduo/Aumento do tamanho da janela
Activao automtica do visor
sem distoro de imagem
Qual a maior imagem no-distorcida que ocupa o ecr?
viewport H viewport H
W/R
H.R
aspect ratio R aspect ratio R
x x
W W
A janela pequena em altura mas ajustada largura A janela alta a estreita comparada com a janela de
do visor da janela de interface, mas algum espao interface.
sobrar em cima/baixo. O visor com a mesma razo de aspecto R ocupar toda
Portanto, no mximo, o visor ter largura W e altura rea grfica da janela de interface em altura, mas
W/R. sobrar algum espao esquerda/direita.
Portanto,no mximo, o visor ter largura H.R e altura H.
Activao automtica do visor
sem distoro de imagem (cont.)
y R>W/H y R<W/H
interface window screen world window interface window screen
world window
viewport H viewport H
W/R
H.R
aspect ratio R aspect ratio R
x x
W W
glViewport(0,0,W,W/R); glViewport(0,0,H*R,H);
Exemplo 4:
janela baixa
Se a janela tem razo de aspecto y R>W/H
R=2.0 e o ecr da janela de interface world window
interface window screen
glViewport(0,0,W,W/R);
glViewport(0,0,360,360/2);
Exemplo 5: janela alta
Se a janela tem razo de aspecto y R<W/H
R=1.6 e o ecr da janela de interface world window interface window screen
tem H=200 e W=360, ento W/H=1.8.
viewport H
Portanto, estamos no segundo caso, e H.R
aspect ratio R
o visor activado com 200 pixis de
altura e 320 pixis de largura. x
W
glViewport(0,0,H*R,H);
glViewport(0,0,320,200);
Estratgia de manuteno das
propores automaticamente na
passagem da janela para o visor
O utilizador aumenta ou diminui o tamanho dum visor com w pixis de largura
e h pixis de altura atravs do arrastamento para fora ou para dentro do canto
inferior direito da janela de interface.
Para evitar distoro, h que mudar o tamanho da janela do domnio de cena
em conformidade.
Para isso, assume-se a priori que a janela da cena um quadrado cujos lados
tm comprimento L.
Uma soluo possvel mudar a janela da cena sempre que o ecr da janela
de interface for alterada. Assim, a callback Glvoid reshape(GLsizei w,
GLsizei h) tem de ser alterada por forma a incluir o cdigo seguinte:
if (w <= h)
gluOrtho2D(-L, L, -L * h/w, L * h/w);
else
gluOrtho2D(-L * w/h, L * w/h, -L, L);
Exemplo 6:
activao automtica do mapea-
mento janela-visor sem distoro
/* Setting up window-viewport automatically without distortion
* Abel Gomes */
#include <OpenGL/gl.h> // Header File For The OpenGL Library
#include <OpenGL/glu.h> // Header File For The GLu Library
#include <GLUT/glut.h> // Header File For The GLut Library
#include <stdlib.h>
void draw(){
// Make background colour yellow
glClearColor( 100, 100, 0, 0 );
glClear ( GL_COLOR_BUFFER_BIT );
// Draw house
glColor3f( 0, 0, 1 );
glRectf(0.0,0.0,30.0,30.0);
glColor3f(1,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(0.0,30.0,1.0);
glVertex3f(30.0,30.0,1.0);
glVertex3f(15.0,40.0,1.0);
glEnd();
// display house
glutSwapBuffers();
} // end of draw()
Exemplo 6:
(cont.)
// Keyboard method to allow ESC key to quit
GLvoid reshape(GLsizei w, GLsizei h)
{
GLfloat L = 100.0f;
if (w <= h)
gluOrtho2D(-L, L, -L * h/w, L * h/w);
else
gluOrtho2D(-L * w/h, L * w/h, -L, L);
Algoritmo de Sutherland-Hodgeman
.
FIM
Exemplo 1:
visor por defeito
Como j foi referido, se glViewport(x, y, width, height) NO
EXPLICITAMENTE usada no programa, o visor por defeito toda a rea
grfica da janela de interface.