Desenho de personagem de desenho animado

Descrição gerada automaticamente com confiança baixa

Logotipo

Descrição gerada automaticamente

Ícone

Descrição gerada automaticamente


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).

Completando o Desenho

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.

Criando Instâncias

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.

Implementando Zoom e Pan

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.