Conheça a iniciativa da Biblioteca dos Desenvolvedores  
Índice da Biblioteca  
Área dos Usuários  
Fórum de Discussão  
Forúm
 
  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>

int main()
{
   float angulo = 0.0f;
   float vx = 0.0f;
   float vy = 1.0f;
   float vz = 0.0f;
   
   // Iniciações básicas da Allegro
   allegro_init();
   install_keyboard();

   // Iniciação da AllegroGL
   install_allegro_gl();
   allegro_gl_set(AGL_Z_DEPTH, 8);
   allegro_gl_set(AGL_COLOR_DEPTH, 16);
   allegro_gl_set(AGL_SUGGEST, AGL_Z_DEPTH | AGL_COLOR_DEPTH);

   // Setando o Modo Gráfico
   set_gfx_mode(GFX_OPENGL_WINDOWED, 640, 480, 0, 0);

   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

   // Iniciando a camera
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 60.0);

   // Laço principal
   while( !key[KEY_ESC] )
   {
      glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
      
      glLoadIdentity();

      glRotatef (angulo, vx, vy, vz);   

      glBegin(GL_TRIANGLES);
      glColor3d( 255, 0, 0 );
      glVertex3f( 0.0f, 0.3f, 0.0f); // Em Vermelho
      glColor3d( 0, 255, 0 );
      glVertex3f(-0.3f,-0.3f, 0.0f); // Em Verde
      glColor3d( 0, 0, 255 );
      glVertex3f( 0.3f,-0.3f, 0.0f); // Em Azul
      glEnd();
   
      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);

static float vx = 0.0f;
static float vy = 1.0f;
static float vz = 0.0f;

// Main padrão, o programa inicia aqui
int main(int argc, char *argv[])
{
   glutInit(&argc, argv);
   glutInitWindowSize(640,480);
   glutInitWindowPosition(0,0);
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

   glutCreateWindow("Programa ROTAÇÃO");

   // callbacks
   glutReshapeFunc(resize);
   glutDisplayFunc(display);
   glutKeyboardFunc(key);
   glutIdleFunc(idle);

   glClearColor(0,0,0,0);
   glutMainLoop();

   return EXIT_SUCCESS;
}

// Função que é chamada quando a janela é redimencionada
static void resize(int width, int height)
{
   const float ar = (float) width / (float) height;

   glViewport(0, 0, width, height);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glFrustum(-ar, ar, -1.0, 1.0, 1.0, 60.0);

   glLoadIdentity() ;
}

// Função que é chamada quando for preciso mostrar ou atualizar a tela
static void display(void)
{
   static float angulo = 0.0f;

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glLoadIdentity();

   glRotatef (angulo, vx, vy, vz);

   // Iniciando nosso triangulo
   glBegin(GL_TRIANGLES);
   glColor3d(255,0,0);
   glVertex3f( 0.0f, 0.3f, 0.0f); // Vermelho
   glColor3d(0,255,0);
   glVertex3f(-0.3f,-0.3f, 0.0f); // Verde
   glColor3d(0,0,255);
   glVertex3f( 0.3f,-0.3f, 0.0f); // Azul
   glEnd();

   angulo += 0.50f;
   Sleep (1);

   glutSwapBuffers();
}

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

Abraços
BDJogos

 

ATUALIZADO: 09/10/2007


Download do exemplo 1 - Allegro - Clique Aqui

Download do exemplo 1 - Glut - Clique Aqui


Contribuidor
Bruno A. Rovela
03/10/2007


 

« Anterior

 

Próximo »

 
 

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.