Conheça a iniciativa da Biblioteca dos Desenvolvedores
Índice da Biblioteca
Área dos Usuários
Fórum de Discussão
41 - Entendendo o sistema de Câmera
Este é um dos capítulos mais difíceis de se entender.
Após aprender as trasnformações do plano devemos ser capazes de modificar nosso plano de visão ( nossa câmera ).
- A câmera aponta para ( foca ) o que estamos vendo na cena.
Para movimentar a câmera devemos fazer trasnformações ( glRotate, glTranslate ). A chave destas transformações são duas matrizes da OpenGL.
As trasnformações tornam possíveis projeções 3D em coordenadas 2D de nossa tela.
A OpenGl nos fornece 3 tipos de transformações:
1 - De visão
Especifica principalmente a localização da camera.
Também é responsável por aumentar ou diminuir a área aonde pode ser desenhado.
2 - De Modelagem
Movimenta os objetos pela cena e descreve as transformações
3 - De Projeção
Especifica as rederizações e o tamanho das impressões de tela
Neste capítulo iremos aprender como modificar o sistema de coordenadas salvando o sistema de coordenadas original.
Para isto usamos o comando glPushMatrix(); e glPopMatrix();
void glPushMatrix(void); e void glPopMatrix(void);
glPushMatrix armazena a matriz atual.
glPopMatrix retira da memória a matriz e da um replace na matriz atual.
Usando esses 2 comandos podemos rotacionar ( ou transformar em qualquer sentido ) o plano sem mexer no antigo plano que já pode ter sido rotacionado( ou transformado ) de alguma maneira.
Transformações de Visão - Viewing Transformations
Primeiro precisamos entender nosso pontos de vista real no plano cartesiano.
Isto deve estar bem claro para a gente que já está programando em OpenGL..
Olhando para o monitor, estamos em linha reta ao eixo Z e a 90 graus do eixo X e Y.
A transformação de visualização é a primeira a ser realizada, pois ela determina a posição da cena.
A posição de origem da cena na OpenGL é ( 0,0,0 ).
Usando a transformação de visão podemos colocar o ponto de observação aonde a gente precisa que ele esteja, e apontando para a direção aonde a gente quiser ( Imagine a camera de Resident Evil ).
É determinando uma transformação de visão que inserimos uma câmera em algum ponto de nosso mundo 3D.
Transformações de Modelagem - Modeling Transformations
É basicamente o que fizemos no capitulo 40, onde manipulamos um objeto em particular.
Com este tipo de transformação podemos rotacionar, aumentar ou diminuir e movimentar objetos.
Transformações de Projeção - Projection Transformations
É a última transformação aplicada que serve para orientar a visualização da cena.
Como já vimos, existem dois tipos de projeção, a ortográfica e a perspectiva.
Na projeção ortográfica, todos os poligonos são desenhados na tela relativo ao tamanho da tela.
Na projeção perspectiva vemos os objetos como se simula-se a visão da vida real, para o horizonte...
Na projeção perspectiva, os objetos mais longe são menores do que os objetos que estão mais próximos.
Em nossos jogos com certeza iremos usar a Projeção Perspectiva.
Exemplo de Projeção Ortográfica do Blender 3D:
Na imagem abaixo vemos um plano com um cubo. Observe que as linhas de fundo do programa estão sempre no mesmo angulo.
Exemplo de Projeção Perspectiva do Blender 3D:
Observe que esta projeção é como o nosso olho vê.. voltada ao horizonte.
Usando a Matriz de Projeções
Podemos ir alterando as matrizes de modelagem e projeção selecionando elas antes.
Por exemplo:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Todas as modificações serão feitas na matriz de Modelview.
Desde os primeiros capítulos sobre OpenGL vinhemos usando a projeção Ortogonal.
Isto por que a OpenGL não nos fornece os ajustes necessários para escalonamentos e perspectivas,
sendo que nós mesmos teremos que fazer isto.
Para criar um sistema de projeção perspectiva, precisamos usar um Frustum ( A área em que a câmera está apontando ( no caso, visualizando ) é conhecida como frustum )...
Com a AllegroGL podemos controlar apenas o glFrustum.
No AllegroGL não existe função de controle de ângulo de câmera, só existe a função glFrustum do OpenGL.. então,
em AllegroGL podemos mexer a câmera, mais não podemos alterar o ângulo de visão.
Na própria OpenGL não existe essa função.
Com o GLUT temos 2 outras funções muito interessantes para trabalhar com a câmera:
Define uma transformação da Câmera.
Transformando a camera, posicionamos ela mais fácilmente.
No exemplo abaixo temos um programa relativamente simples.
Neste programa em AllegroGL criei uma struct CAMERA que terá todos os valores de configuração da câmera para o próximo exemplo.
Eu iniciei a câmera com os seguintes valores.. é muito importante observar isto muito bem:
Observe que a câmera está olhando exatamente para os eixos iniciais da OpenGL.
Apenas vnear e vfar está com valores diferentes pois eles indicam a profundidade da cena.
Nossa profundidade começará em 1.0f ( Inicio da tela ) e terminará em 10.0f ( Fundo da tela );
Usando as Teclas A e Z o objeto é translocado para a nova posição criando um sistema de zoom perfeito.
Observe que para fazer isto também tivemos que alterar nossa iniciação da câmera:
Ao invez de iniciar a câmera com Modelview, iniciamos ela com Projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
CÓDIGO... // Exemplo de Zoom com AllegroGL sem funções especiais do GLUT // Autor: Adriano Waltrick
// BDJogos
// Data: 22/11/2007
#include <allegro.h>
#include <alleggl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
1 - Quando iniciamos o programa, a imagem que aparece é a seguinte:
Isto está acontecendo por que o quadrado está posicionado da seguinte maneira:
Observe que a visão da camera começa em 1.0, e por isso ela não consegue mostrar todo o quadrado
2 - Se precionarmos Z, o Zoom será diminuido:
Neste ponto, o quadrado está dentro da visão de nossa camera
Se precionarmos muito a tecla Z até o valor chegar a -10.1 , o quadrado não irá mais aparecer na tela, pois ele chegou no limite da visão especificado para nossa câmera.
No código abaixo, vamos fazer a movimentação da visão da câmera.
Quando forem apertadas as teclas direcionais, a câmera irá se mover ( observe que, não é o quadrado que se move );
Para isso, temos que novamente voltar a trabalhar com a matrix de projeção.
CÓDIGO...
// Exemplo de Zoom com AllegroGL sem funções especiais do GLUT // Autor: Adriano Waltrick
// BDJogos
// Data: 22/11/2007 #include <allegro.h>
#include <alleggl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
O programa acima é relativamente básico.
Usamos a função
gluLookAt que possiciona a câmera e indica para aonde a câmera vai apontar.
Com as teclas ( A, W, S, D ) podemos alterar a posição da câmera.
Observe que, mesmo alterando a posição da câmera, sempre estamos olhando para o ponto 0,0,0 ( a não ser quando atualizamos o Frustum ).
É muito importante entender isto.
Por exemplo, se você manter precionado a tecla A, a cena vai vir cade vez mais próxima da tela, até se inverter.
Isto acontece por que a camera nunca para de olhar para o mesmo ponto, e é ela quem está se movendo. E ela inverte por que possívelmente seus pontos ficaram negativos.
O exemplo acima pode ser fácilmente aplicado ao GLUT.
VOCÊ PRECISA
SABER...
Como no exemplo, a função gluLookAt não deve ser aplicada na matrix projetiva!!!
Preste muita atenção na forma de iniciação da câmera, isto é muito importante:
// Demais alterações no mundo 3D, gluLookAt trabalha aqui
Observe que fizemos também uso das funções glPushMatrix(); e glPopMatrix();
Usamos essas funções para que as alterações de câmera não interferisem diretamente em nosso posicionamento de objetos.
Ainda não aprendemos tudo sobre câmeras em OpenGL :)
01/06/2007 (C) Copyright. Todos os Direitos Reservados. Leia a política de privacidade do portal.
É proibida a cópia de conteúdo deste site de acordo com
a Lei Brasileira de Direitos Autorais.