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