Computação Gráfica
Exercício sobre Zoom e
Pan
Profa. Isabel Harb Manssour / Prof. Márcio Sarroglia Pinho
O objetivo desta aula é exercitar a aplicação das transformações geométricas, a
criação de instâncias e a manipulação da window, ou janela de seleção,
para realizar operações de zoom e pan.
Para a resolução dos exercícios desta aula utilize o mesmo exemplo de aulas anteriores.
Abra o projeto exemploGLUT.cbp e adicione ao projeto
o arquivo CasaOpenGL.cpp. Execute o
programa e veja o resultado.
A janela de seleção (glOrtho) deste programa está entre (-10,-10) e
(10,10).
Na
tela, você pode observar uma linha horizontal, na metade da altura. Altere a
função DesenhaEixos() a fim de fazer um
eixo vertical.
Logo acima da linha horizontal foram desenhadas duas linhas, que representam o
telhado de uma casa. Altere a função DesenhaCasa()
de maneira a completar o desenho da casa. Veja nesta
página, como desenhar outros objetos além de linhas.
O
objetivo agora é criar duas instâncias da casa que podem ser manipuladas
através das transformações de escala, rotação e translação, de forma
independente, como exemplificado na próxima figura.
Para criar as instâncias, altere a função Display()
inserindo mais uma chamada da função DesenhaCasa(). Antes de cada
chamada chame as funções de transformações geométricas da OpenGL (glTranslate,
glScale e glRotate).
void
Desenha(void)
{
....
// Desenha a primeira instância da casa
glScalef(...);
glTranslatef(...);
glRotatef(...);
DesenhaCasa();
// Desenha a segunda instância da casa
glScalef(...);
glTranslatef(...);
glRotatef(...);
DesenhaCasa();
....
}
É necessário criar outras variáveis para guardar as
transformações que serão aplicadas em cada instância da casa. Utilize as teclas
para alterar o valor das variáveis.
Pergurta: Você está conseguindo mexer em uma só instância ??
Para que as transformações geométricas sejam aplicadas apenas em uma das
instâncias de cada vez, devem ser utilizadas as funções glPushMatrix() e
glPopMatrix() da seguinte maneira:
void
Desenha(void)
{
....
// Desenha a primeira instância da casinha
glPushMatrix();
glScalef(...);
glTranslatef(...);
glRotatef(...);
DesenhaCasa();
glPopMatrix();
// Desenha a segunda instância da casinha
glPushMatrix();
glScalef(...);
glTranslatef(...);
glRotatef(...);
DesenhaCasa();
glPopMatrix();
....
}
As funções glPushMatrix e glPopMatrix são usadas para definir o
escopo das transformações. A glPushMatrix é utilizada para guardar a
matriz de transformação corrente na pilha, e a glPopMatrix para
recuperar a matriz de transformação corrente da pilha.
Agora
implemente as operações de zoom e pan.
Como o zoom consiste na alteração das coordenadas da window no sistema
de referência do universo, para aplicar o zoom altere as coordenadas da função glOrtho
sempre que o usuário pressionar uma tecla.
A chamada da função glOrtho está na função Display, que redesenha
a tela. Note que a função glOrtho recebe como parâmetro a
variável win, portanto, para realizar o zoom, o programa deve permitir
que o usuário altere o valor destas variáveis.
Use as teclas para alterar esta variável e veja o resultado.
Uma sugestão: Faça win = win * 1.1;
Pergunta: Porque a imagem dos eixos não muda, mas as casas sim ??
Para implementar o Pan, que consiste, basicamente, no deslocamento da window
no sistema de referência do universo, o procedimento é semelhante ao zoom,
porém as coordenadas da função glOrtho devem ser alteradas de maneira
que a window seja deslocada para cima, para baixo, para esquerda e para
direita.
Para implementar esta operação, vamos precisar de duas variáveis globais que
armazenem este deslocamento. Estas variáveis devem ser declaradas e
inicializadas conforme ilustra o trecho de código a seguir.
#include ......
float win, panX, panY;
...
void init (void)
{
win = 10;
panX = panY = 0;
}
A seguir, altere a chamada da função glOrtho da seguinte maneira:
glOrtho (-win+panX, win+panX,
-win+panY, win+panY);
Agora defini quais as teclas que irão deslocar a window, ou seja, que irão
alterar os valores destas variáveis.
Teste, por exemplo:
panX++;
panY--;
FIM.