Conheça a iniciativa da Biblioteca dos Desenvolvedores
Índice da Biblioteca
Área dos Usuários
Fórum de Discussão
40 - Movimentando e transformando
Agora que sabemos como escrever na tela, podemos aprender as duas funções que ainda faltam na OpenGL.
Primeiro vamos ver como movimentar um cubo 3D.
Você deve estar pensando, não é só alterar os parâmetros x, y e z na hora de imprimir os pontos ?
Sim, podemos fazer isto, mais seria uma tarefa ardua.
A OpenGL possui uma função chamada glTranslatef que faz a movimentação e imprime os pontos no local correto para a gente,
evitando uma trabalhera.
void glTranslatef( GLfloat x, GLfloat y, GLfloat z);
Esta função produz uma translação ( Movimentação ). A matriz atual é multiplicada pela matriz de translação que usa os parâmetros passados para a função.
VOCÊ PRECISA
SABER...
Para entender este capítulo e seus códigos, é importante ter lido os conteúdos citados abaixo:
O código a seguir mostra como movimentar um cubo 3D ( que gira sobre seu proprio eixo ) nos eixos X e Y usando o AllegroGL
Teste o programa usando as teclas direcionais.
CÓDIGO... // Exemplo de como movimentar um cubo ( que gira sobre seu eixo ) em AllegroGL // Autor: Adriano Waltrick
// BDJogos
// Data: 05/11/2007 #include <allegro.h>
#include <alleggl.h>
int main()
{ // Iniciações básicas da Allegro
allegro_init();
install_keyboard();
// Setando o Modo Gráfico
set_gfx_mode(GFX_OPENGL_WINDOWED, 640, 480, 0, 0);
// Criando uma FONT para poder escrever na tela as variáveis X e Y
FONT *agl_font = NULL;
glEnable(GL_TEXTURE_2D);
agl_font = allegro_gl_convert_allegro_font(font, AGL_FONT_TYPE_TEXTURED, 250.0f);
O código acima é auto-explicativo .
Sempre que apertamos as teclas direcionais, o objeto irá se movimentar no plano (x,y).
Eu coloquei ele girando em seu próprio eixo para demonstrar a diferença entre as funções.
O código a seguir mostra como movimentar um cubo 3D ( que gira sobre seu proprio eixo ) nos eixos X e Y usando o GLUT
CÓDIGO...// Exemplo de como movimentar um cubo ( que gira sobre seu eixo ) em GLUT // Autor: Adriano Waltrick
// BDJogos
// Data: 20/11/2007 #include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <GL/glut.h>
#include <stdlib.h>
// Prototipos das funções que serão chamadas pela Glut ( Callback )
static void display(void);
static void key(unsigned char key, int x, int y);
static void EspecialKey(int key, int x, int y);
static void idle(void);
static void resize(int width, int height);
void DesenhaTexto( char *string, float x, float y );
// Angulo para fazer o quadrado girar
GLfloat angulo;
// Posições X e Y do quadrado
GLfloat x;
GLfloat y;
// Função que é chamada quando uma tecla é apertada
static void key(unsigned char key, int x, int y)
{
switch (key)
{ // caso aperte ESC
case 27 :
exit(0);
break;
}
glutPostRedisplay();
}
// Função que executa rotinas padrões da Glut
static void idle(void)
{
glutPostRedisplay();
}
static void EspecialKey(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_UP: // Caso direcional para CIMA - Aumenta valor de vy
{
::y += 100;
}
break;
case GLUT_KEY_DOWN: // Caso direcional para BAIXO - Diminui valor de vy
{
::y -= 100;
}
break;
// Posição no universo onde o texto será colocado
glRasterPos2f(x, y);
// Exibe caracter a caracter
while(*string)
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,*string++);
}
glPopMatrix();
}
FIM DE CÓDIGO...
O exemplo do GLUT é muito importante!
Observe que nele usamos a nova função, usamos a função de escrever na tela e as funções de manipulação de teclado.
O restante do código é muito parecido com o do AllegroGL, entender a abordagem prática das duas bibliotecas faz com que não tenhamos preconceitos com novas bibliotecas ( SDL, Directx, Ogre ) que poderemos vir a aprender ou ser obrigados a usar mais tarde.
Agora iremos conhecer uma função para escalar nosso objeto:
void glScalef(GLfloat x, GLfloat y, GLfloat z);
Esta função produz um fator não uniforme de escala ( Diminui ou aumenta ). A matriz atual é multiplicada pela matriz de escalar que usa os parâmetros passados para a função.
O código a seguir mostra como aumentar e diminuir um cubo 3D ( que gira sobre seu proprio eixo ) nos eixos X e Y usando o AllegroGL
Teste o programa usando as teclas "A" e "Z".
CÓDIGO... // Exemplo de como aumentar ou diminuir o tamanho de um cubo ( que gira sobre seu eixo ) em AllegroGL // Autor: Adriano Waltrick
// BDJogos
// Data: 20/11/2007 #include <allegro.h>
#include <alleggl.h>
int main()
{ // Iniciações básicas da Allegro
allegro_init();
install_keyboard();
// Setando o Modo Gráfico
set_gfx_mode(GFX_OPENGL_WINDOWED, 640, 480, 0, 0);
// Criando uma FONT para poder escrever na tela as variáveis X e Y
FONT *agl_font = NULL;
glEnable(GL_TEXTURE_2D);
agl_font = allegro_gl_convert_allegro_font(font, AGL_FONT_TYPE_TEXTURED, 250.0f);
Observe que no exemplo acima estamos escalando em X, Y e Z.
Isto dá a impressão de Zoom.
Um detalhe importante que temos que observar é:
- Para aumentar a altura do objeto, devemos manter( salvar ) os parametros antigos de X e Z iguais.
Exemplo: glScalef( 10, 50, 10 );
- Para aumentar a largura do objeto, devemos manter( salvar ) os parametros antigos de Y e Z iguais.
Exemplo: glScalef( 50, 10, 10 );
Aumentar a profundidade de nosso objeto não vai funcionar por enquanto.
As teclas A e Z são geralmente utilizadas para fazer zoom.
Porém, o que fizemos acima não é um zoom, na verdade estamos aumentando o tamanho do objeto.
O efeito de zoom seria dado usando o comando glTranslatefpassando como parametro o eixo Z.
Porém, se fizermos isso agora não vai funcionar.
Não podemos ver as modificações dos parametros Z das funções por que a OpenGL tem por padrão a visão Ortogonal.
Você precisa saber ...
Orthographic view / Visão Ortogonal
Em uma visão ortogonal todos os pontos do objeto são perpendiculares ao plano de visão, e são projetados em paralelo.
Em geometria, perpendicularidade (ou ortogonalidade) é uma noção que indica se dois objectos (retas ou planos) fazem um ângulo de 90º.
Este modo de visão ortográfica é muito parecido com os jogos Isométricos.
A perspectiva do tipo isométrica ocorre quando o observador está situado no infinito (e portanto, as retas projetantes são paralelas umas às outras) e incidem perpendicularmente ao Plano de Quadro ( Wikipedia ).
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.
Levando isto em consideração, ao tentar modificar o parametro de Z com o translate na nossa visão atual, não iremos perceber o zoom.
Para perceber o zoom devemos fazer uma projeção perspectiva.
Não se esqueça que, quando aplicamos glRotate, glTranslate e glScale estamos modificando as coordenadas do mundo 3D e não um objeto em si ( grupo de vertices ).. Isto é muito importante para entender o sistema de cameras.
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.