Conheça a iniciativa da Biblioteca dos Desenvolvedores
Índice da Biblioteca
Área dos Usuários
Fórum de Discussão
37 - Rotacionando Objetos com OpenGL
Esse tutorial tem por finalidade mostrar de forma simples como é feito o código para rotacionar
uma figura geométrica usando OpenGL. Iremos utilizar um exemplo feito em AllegroGL e Glut como
de custume.
A rotação é feita através da função glRotatef(Ângulo, x, y, z),
que pode receber quatro números float ou double (glRotated) como parâmetro.
Neste caso, a matriz atual é multiplicada por uma
matriz de rotação de "Ângulo" graus ao redor do eixo definido pelo vetor "x,y,z" no sentido
anti-horário.
VOCÊ PRECISA
SABER...
O valor do ângulo pode variar de 0.0f a 360.0f ( lido em graus ).
Para que possamos entender melhor segue a tabela abaixo com alguns exemplos.
Código
Descrição
glRotatef (angulo, 0.0f, 0.0f, 0.0f);
Se você não especificar o eixo em que a figura vai ser rotacionada a função usará
multiplicação de matriz para reduzir e inverter a figura geométrica.
glRotatef (angulo, 1.0f, 0.0f, 0.0f);
A figura geométrica rotaciona no eixo x.
É como se o objeto estivesse dando cambalhotas de
frente para você.
glRotatef (angulo, 0.0f, 1.0f, 0.0f);
A figura geométrica rotaciona no eixo y.
É como se o objeto estivesse dando uma voltinha
para você.
glRotatef (angulo, 0.0f, 0.0f, 1.0f);
A figura geométrica rotaciona no eixo z.
É como se o objeto fosse um catavendo.
Ele roda em círculos.
Uma mesma função glRotatef pode rotacionar mais de 1 eixo, exemplo para rotacionar nos 3 eixos ( X, Y , Z )
glRotatef (angulo, 1.0f, 1.0f, 1.0f);
Todas as figuras geométrica que estiverem abaixo da função glRotatef serão rotacionadas no mesmo
sentido.
Em um tutorial próximo iremos explicar como fazer para rotazionar figuras iguais ou
diferentes em sentidos diferentes.
Ao exemplificar a função glRotatef iremos usar o tipo GL_TRIANGLES para gerar um triângulo na tela.
O código abaixo foi implementado em AllegroGL.
CÓDIGO...// Exemplo de código que rotaciona objeto usando Allegro e AllegroGL // Autor: Bruno A. Rovela
// BDJogos
// Data: 03/10/2007
#include <allegro.h>
#include <alleggl.h>
if (key[KEY_X]) // Se apertar x rotaciona no eixo x
{
vx = 1.0f;
vy = 0.0f;
vz = 0.0f;
}
if (key[KEY_Y]) // Se apertar y rotaciona no eixo y
{
vx = 0.0f;
vy = 1.0f;
vz = 0.0f;
}
if (key[KEY_Z]) // Se apertar z rotaciona no eixo z
{
vx = 0.0f;
vy = 0.0f;
vz = 1.0f;
}
allegro_gl_flip();
angulo += 0.50f;
}
allegro_exit();
return 0;
}
END_OF_MAIN();
FIM CÓDIGO...
O obetivo do programa acima é mostrar na prática como o objeto se comporta rotacionando em eixos
diferentes.
Note que para mudar a direção de rotação é necessário aperta X se você quiser ver ele
rocaionar no eixo x,
apertar Y se vc quiser ver ele rotacionar no eixo Y ou Z se você quiser ver ele
rotacionar no eixo z.
VOCÊ PRECISA
SABER...
Inverter as variáveis ( x, y, z ) da função de rotação de 1.0 para -1.0 faz com que seja invertida a forma de rotação
No inicio desse tutorial eu mencionei que o ângulo pode variar de de 0º a 360º, representados como
0.0f a 360.0f.
No entanto, o código “angulo += 0.50f;” acrescenta 0.50f a cada renderização de tela.
Não existe nenhum tratamento para quando valor atingir 360º.
Você pode deixar o OpenGL se virar para
converter e fazer o tratamento ou pode incluir uma condição dizendo que o ângulo recebe 0.0f quando
chegar em 360.0f.
A seguir iremos implementar o código acima no Glut.
CÓDIGO...// Exemplo de código que rotaciona objeto usando GLUT // Autor: Bruno A. Rovela
// BDJogos
// Data: 03/10/2007
#include <GL/glut.h>
#include <stdlib.h>
static void display(void);
static void key(unsigned char key, int x, int y);
static void idle(void);
static void resize(int width, int height);
// Função que é chamada quando uma tecla é apertada
static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 27 : // Caso aperte ESC sai do programa
{
exit(0);
break;
}
case 'x': // Caso aperte x rotaciona no eixo x
{
vx = 1.0f;
vy = 0.0f;
vz = 0.0f;
break;
}
case 'y': // Caso aperte y rotaciona no eixo y
{
vx = 0.0f;
vy = 1.0f;
vz = 0.0f;
break;
}
case 'z': // Caso aperte z rotaciona no eixo z
{
vx = 0.0f;
vy = 0.0f;
vz = 1.0f;
break;
}
}
glutPostRedisplay();
}
// Função que executa rotinas padrões da Glut
static void idle(void)
{
glutPostRedisplay();
}
FIM CÓDIGO...
Caro leitor, chegamos ao fim do entendimento da função responsável por rotacionar as
figuras.
Se você estiver com alguma dúvida ou sugestão favor entrar em contato
com os membros pelo fórum.
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.