sábado, 28 de maio de 2011

Programa da Prova de Laboratório

Prezados, aqui vai o código que eu fiz para a prova de laboratório. Para quem não conseguiu fazer e gostaria de saber como:



//*****************************************************
//
// Animação com Primitivas 3D
// Programa OpenGL de Animação de Primitivas 3D feito para
// a prova de laboratório da Turma CC6111 de Computação Gráfica
// do Centro Universitário da FEI, aplicada em 27/05/11
// Autores: Prof. Dr. Paulo Sérgio Rodrigues e Mestrando Guilherme Alberto Wachs-Lopes
//
// Objetivo: Animar uma primitiva gráfica 3D utilizando Visão Perspectiva e Modelos de Iluminação
//

#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

// variáveis Globais
double zoom; // controla o Zoom
double posx,posy,posz; // controla asa translações
double vx,vy,vz;  // controla as posições
double rx,ry,rz; // controla as rotações


// Função responsável pela especificação dos parâmetros de iluminação
void DefineIluminacao (void)
{
 // Capacidade de brilho do material
 GLfloat especularidade[4]={0.7,0.7,0.7,1.0};
    GLfloat MatDifuse[4]={1.0,0,0,1.0}; 
 GLint especMaterial = 125;
           
    GLfloat luzAmbiente[4]={0.2,0.2,0.2,1.0};
 GLfloat luzDifusa[4]={0.7,0.7,0.7,1.0};    // "cor"
 GLfloat luzEspecular[4]={0.5, 0.5, 0.5, 1.0};// "brilho"
 GLfloat posicaoLuz[4]={0, 0, 20, 1};
 // Define a refletância do material
 glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);
 // Define a concentração do brilho
 glMateriali(GL_FRONT,GL_SHININESS,especMaterial);

    glMaterialfv(GL_FRONT,GL_DIFFUSE,MatDifuse);
 // Ativa o uso da luz ambiente
 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);
 // Define os parâmetros da luz de número 0
 glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente);
 glLightfv(GL_LIGHT0, GL_DIFFUSE, luzDifusa );
 glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular );
 glLightfv(GL_LIGHT0, GL_POSITION, posicaoLuz );  
 //Habilita o uso de iluminação
 glEnable(GL_LIGHTING); 
 // Habilita a luz de número 0
 glEnable(GL_LIGHT0);
 // Habilita o depth-buffering
 //glEnable(GL_DEPTH_TEST);
 
}


// Função callback chamada quando o tamanho da janela é alterado
void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
    GLsizei largura, altura;
   
   // Evita a divisao por zero
    if(h == 0)  h = 1;
   
    // Atualiza as variáveis
    largura = w;
    altura = h;
   
   // Especifica as dimensões da Viewport
    glViewport(0, 0, largura, altura);
   
    // Inicializa o sistema de coordenadas
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
   
    glOrtho(-100.0,100.0,-100.0,100.0,-100.0,100);
    glMatrixMode(GL_MODELVIEW);
   
   glLoadIdentity();
}


// Função callback chamada para gerenciar eventos de teclas
void Teclado (unsigned char key, int x, int y)
{
 if (key == 27)
  exit(0);
}


// Função responsável por inicializar parâmetros e variáveis
void Inicializa (void)
{  
    // inicializa variáveis   
    zoom = 120.0;
    posx = 20.0;
    posy = 0.0;
    posz = 0.0;
    vx = 1.0;
    vy = 0.5;
    vz = 0;
    rx = 0.0;
    ry = 0.0;
    rz = 0;   
   
   // Define a cor de fundo da janela de visualização como branca
   glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
   glEnable(GL_CULL_FACE);
   // Habilita o modelo de colorização de Gouraud
   glShadeModel(GL_SMOOTH);   
    DefineIluminacao();
}

void animacao(int){
    
    double velCor=0.1;
  
    // verifica se objeto nao ultrapassou janela
    if (posx > 100 || posx < -100){
     vx=-vx;
    }
   
    // verifica se objeto nao ultrapassou janela   
    if (posy > 100 || posy < -100){
     vy=-vy;
    }
   
    // atualiza translacao
    posx+=vx;   
    posy+=vy;
   
    // artualiza a rotação
    rx += 1;
    ry += 2;
           
    glutPostRedisplay();    
    glutTimerFunc(1,animacao,1);
         
}


void desenha(){
   
     // limpa as matrizes de desenho    
     glLoadIdentity();
     glClear(GL_COLOR_BUFFER_BIT);

     // realiza as transformacoes
     glTranslatef(posx,posy,posz);
     glRotatef(rx,1,0,0);
     glRotatef(ry,0,1,0);    

     // desenha uma esfera
     glTranslatef(-5,-5,0);
     glutSolidSphere(10,30,30);
    
     // desenha um cubo
     glTranslatef(10,10,0);
     glutSolidCube(10);
    
     // desenha a outra esfera
     glTranslatef(10,10,0);
     glutSolidSphere(10,30,30);
    
     glutSwapBuffers();    
}


// Programa Principal
int main(void)
{  
   
    // Define do modo de operação da GLUT
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

 // Especifica a posição inicial da janela GLUT
 glutInitWindowPosition(5,5);

 // Especifica o tamanho inicial em pixels da janela GLUT
 glutInitWindowSize(600,600);

 // Cria a janela passando como argumento o título da mesma
 glutCreateWindow("Prova de Laboratório");

 // Registra a função callback de redesenho da janela de visualização
 glutDisplayFunc(desenha);

 // Registra a função callback de redimensionamento da janela de visualização
 glutReshapeFunc(AlteraTamanhoJanela);

 // Registra a função callback para tratamento das teclas ASCII
 glutKeyboardFunc (Teclado);
   
glutTimerFunc(10,animacao,1);
   
 // Chama a função responsável por fazer as inicializações
 Inicializa();

 // Inicia o processamento e aguarda interações do usuário
 glutMainLoop();

 return 0;
}

Nenhum comentário:

Postar um comentário