Buscar
 
 

Resultados por:
 


Rechercher Busca avançada

Últimos assuntos
Relogio

Um projeto em openGL - Logo do curso em 3D

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Um projeto em openGL - Logo do curso em 3D

Mensagem  Diego Henrix em Qua Jan 30, 2013 9:50 am

Certo dia o Juk teve uma ideia. Então eu e o Marcelo embarcamos nela também.

A ideia era criar uma aplicação 3D que exibisse o logo do curso flutuando. Então resolvemos usar openGL para começar com algo bem simples.

Eis os resultados até agora:

**Vídeo ver0.1: http://www.youtube.com/watch?v=RR4zpzJ95Nw

Detalhes:

Versão 0.0:




Código:

//gcc tads_logo_0.c -o tads_logo_0 -lm -lGL -lGLU -lglut
#include <GL/freeglut.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

float angulo = 0;
int fps_cont = 0;
int cont = 0;
int cont2 = 0;

//display-list para desenho do logo
GLint lista_tads;


//variáveis para posicionamento da câmera
float pos_x = -5.0, pos_y = 5.0, pos_z = 12.0;
float ang_x = 0.0, ang_y = 0.0, ang_z = 0.0;

void OnDisplay (void);
void Idle (void);
void OnResize (int w, int h);
void Teclado(unsigned char key, int x, int y);
void TecladoEspecial(int key, int x, int y);
void timer_0 (int _valor);
void timer_1 (int _valor);
void timer_2 (int _valor);


void desenha_cubo(float tamanho);
void constroi_tads(GLfloat _tamanho);



int main (int argc, char * argv [])
{
    /* variáveis usadas para iluminação */
    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]={1.0, 1.0, 1.0, 1.0};// "brilho"
    GLfloat posicaoLuz[4]={10.0, 10.0, 10.0, 1.0};
    GLfloat especularidade[4]={1.0,1.0,1.0,1.0};// Capacidade de brilho do material
    GLint especMaterial = 60;  //concentração do brilho


    glutInit(&argc, argv);
   
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);   
    glutInitWindowSize(600,480);
    glutInitWindowPosition(600,600);
    glutCreateWindow("Tecnologia em Analise e Desenvolvimento de Sistemas");
   
   
    //registros de callbacks
    glutDisplayFunc(OnDisplay);
    glutReshapeFunc(OnResize);
    glutKeyboardFunc(Teclado);
    glutSpecialFunc(TecladoEspecial);
    glutIdleFunc(Idle);
    glutTimerFunc(20, timer_0, 0);
    glutTimerFunc(1000, timer_1, 0);

   
    // Habilita e define a função do depth-buffer
    glEnable (GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
   
    //glEnable (GL_POLYGON_SMOOTH); //mostra a malha. Porquê?!?!
    //glEnable (GL_LINE_SMOOTH);
   
    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
   
    // Habilita o modelo de colorização de Gouraud
    glShadeModel(GL_SMOOTH);
    // Define a refletância do material
    glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);
    // Define a concentração do brilho
    glMateriali(GL_FRONT,GL_SHININESS,especMaterial);
    // 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 a definição da cor do material a partir da cor corrente
    glEnable(GL_COLOR_MATERIAL);
    //Habilita o uso de iluminação
    glEnable(GL_LIGHTING);
    // Habilita a luz de número 0
    glEnable(GL_LIGHT0);
   
   
    // Habilita a exibição de objetos transparentes
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   

   
    //glCullFace (GL_BACK);
    //glEnable (GL_CULL_FACE);
   
    constroi_tads(12);

    glutMainLoop();
    return 0;
}

void Teclado(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 27:
        {
            glutLeaveMainLoop();
            break;
        }
       
        case 65:
        case 97:
        {
            pos_x+=1;
            break;
        }
        case 68:
        case 100:
        {
            pos_x-=1;
            break;
        }
       
        case 87:
        case 119:
        {
            pos_z+=1;
            break;
        }
        case 83:
        case 115:
        {
            pos_z-=1;
            break;
        }
       
        case 81:
        case 113:
        {
            pos_y+=1;
            break;
        }
        case 69:
        case 101:
        {
            pos_y-=1;
            break;
        }
    }
}

void TecladoEspecial(int key, int x, int y)
{
    switch(key)
    {
        case GLUT_KEY_LEFT:
        {
            ang_y-=5;
            break;
        }
       
        case GLUT_KEY_RIGHT:
        {
            ang_y+=5;
            break;
        }
       
        case GLUT_KEY_UP:
        {
            ang_x+=5;
            break;
        }
       
        case GLUT_KEY_DOWN:
        {
            ang_x-=5;
            break;
        }
    }
}

void timer_0 (int _valor)
{
   
    glutTimerFunc(20, timer_0, 0);
    angulo += 0.5;
}

void timer_1 (int _valor)
{   
    glutTimerFunc(1000, timer_1, 0);
    printf("fps: %d\n", fps_cont);
    fps_cont = 0;
}

   

void Idle (void)
{
    glutPostRedisplay();
}


void OnResize(int w, int h)
{
    float porprocao;

    printf("%d  %d\n", w, h);//debug
   
    // Evita a divisao por zero
    if(h == 0)
    {
        h = 1;
    }
    porprocao =  (float)w/(float)h;
   
   
    // Especifica as dimensões da Área de Visualização
    glViewport(0, 0, w, h);   
   

    // Inicializa o sistema de coordenadas
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(50, porprocao, 0.1, 100);
   
    //corrige perpectiva - realmente melhora?
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

}

void desenha_cubo(float tamanho)
{
    tamanho /= 2.0;

    glBegin(GL_QUADS);
        // Face posterior
        glNormal3f(0.0, 0.0, -1.0);// Normal da face
        glVertex3f(tamanho, tamanho, -tamanho);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glVertex3f(-tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face frontal
        glNormal3f(0.0, 0.0, 1.0);// Normal da face       
        glVertex3f(-tamanho, tamanho, tamanho);
        glVertex3f(-tamanho, -tamanho, tamanho);
        glVertex3f(tamanho, -tamanho, tamanho);
        glVertex3f(tamanho, tamanho, tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face lateral esquerda
        glNormal3f(-1.0, 0.0, 0.0);// Normal da face       
        glVertex3f(-tamanho, tamanho, tamanho);
        glVertex3f(-tamanho, tamanho, -tamanho);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glVertex3f(-tamanho, -tamanho, tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face lateral direita
        glNormal3f(1.0, 0.0, 0.0);// Normal da face
        glVertex3f(tamanho, tamanho, tamanho);
        glVertex3f(tamanho, -tamanho, tamanho);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glVertex3f(tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face superior
        glNormal3f(0.0, 1.0, 0.0);// Normal da face       
        glVertex3f(-tamanho, tamanho, -tamanho);
        glVertex3f(-tamanho, tamanho, tamanho);
        glVertex3f(tamanho, tamanho, tamanho);
        glVertex3f(tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face inferior
        glNormal3f(0.0, -1.0, 0.0);// Normal da face       
        glVertex3f(-tamanho, -tamanho, tamanho);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glVertex3f(tamanho, -tamanho, tamanho);
    glEnd();
}


void constroi_tads (GLfloat _tamanho)
{
    GLfloat tamanho_bloco = ((float)_tamanho/(float)12) * 0.85;
    GLfloat tamanho_metade = ((float)_tamanho/(float)12) * 0.5;
    GLfloat tamanho_total = ((float)_tamanho/(float)12);
   
    lista_tads = glGenLists(1);

    glNewList(lista_tads, GL_COMPILE);
        //desenha a letra T
        glPushMatrix();
        glTranslatef(-tamanho_total*0.6, 0.0, 0.0);
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 5*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix(); 
            glTranslatef(-(tamanho_metade + 3*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();   
           
            glPushMatrix(); 
            glTranslatef(-(tamanho_metade + 4*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
               
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra A
        glPushMatrix();
        glTranslatef(-tamanho_total*0.2, 0.0, 0.0);
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 1*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 1*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra D
        glPushMatrix();
        glTranslatef(tamanho_total*0.2, 0.0, 0.0);
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 1*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 2*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 2*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 1*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra S
        glPushMatrix();
        glTranslatef(tamanho_total*0.6, 0.0, 0.0);
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 4*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 4*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
    glEndList();
}
 

void OnDisplay ()
{
    //limpa a tela para redesenho
    glClearColor (0.98f, 0.98f, 0.98f, 1.0f);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
   
    //inicializa o sistema de cordenadas
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
   
    //define a posição e alvo da câmera
    gluLookAt(pos_x, pos_y, pos_z,0,0,0,0,1,0);   
   
   
    glTranslatef(0.0, sin(angulo/5)*0.5, 0.0); // a logo sobe e desce seguindo uam senóide
    glRotatef(angulo, 0, 1, 0); // a logo é constantemente rotacionada

    glColor4f(0.1f, 0.9f, 0.1f, 1.0f);
    glCallList(lista_tads); // desehna a logo

   
    glFlush (); //executa comandos pendentes
    glutSwapBuffers(); //coloca o desenho na tela
    fps_cont ++; //variável para contagem d
}


https://docs.google.com/file/d/0B4m9FQ8snMU3STNqbkY4dV91c2M/edit

------------------------------------------------------------------------------------

Versão 0.1:




Código:

//gcc tads_logo_1.c -o tads_logo_1 -lm -lGL -lGLU -lglut image.o
#include <GL/freeglut.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "image.h"

float angulo = 0;
int fps_cont = 0;
int cont = 0;
int cont2 = 0;

//display-list para desenho do logo
GLint lista_tads;


//variáveis para posicionamento da câmera
float pos_x = -5.0, pos_y = 5.0, pos_z = 12.0;
float ang_x = 0.0, ang_y = 0.0, ang_z = 0.0;

void OnDisplay (void);
void Idle (void);
void OnResize (int w, int h);
void Teclado(unsigned char key, int x, int y);
void TecladoEspecial(int key, int x, int y);
void timer_0 (int _valor);
void timer_1 (int _valor);
void timer_2 (int _valor);


void desenha_cubo(float tamanho);
void constroi_tads(GLfloat _tamanho);
void carregar_texturas(void);
GLint textura_plano;


int main (int argc, char * argv [])
{
    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]={1.0, 1.0, 1.0, 1.0};// "brilho"
    GLfloat posicaoLuz[4]={10.0, 10.0, 10.0, 1.0};
    GLfloat especularidade[4]={1.0,1.0,1.0,1.0};// Capacidade de brilho do material
    GLint especMaterial = 60;


    glutInit(&argc, argv);
   
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);   
    glutInitWindowSize(600,480);
    glutInitWindowPosition(600,600);
    glutCreateWindow("Tecnologia em Analise e Desenvolvimento de Sistemas");
   
    glutDisplayFunc(OnDisplay);
    glutReshapeFunc(OnResize);
    glutKeyboardFunc(Teclado);
    glutSpecialFunc(TecladoEspecial);
    glutIdleFunc(Idle);
    glutTimerFunc(20, timer_0, 0);
    glutTimerFunc(1000, timer_1, 0);

   
    // Habilita e define a função do depth-buffer
    glEnable (GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
   
    //glEnable (GL_POLYGON_SMOOTH); //mostra a malha. Porquê?!?!
    //glEnable (GL_LINE_SMOOTH);
   
    //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
   
    // Habilita o modelo de colorização de Gouraud
    glShadeModel(GL_SMOOTH);
    // Define a refletância do material
    glMaterialfv(GL_FRONT, GL_SPECULAR, especularidade);
    // Define a concentração do brilho
    glMateriali(GL_FRONT, GL_SHININESS,especMaterial);
    // 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 a definição da cor do material a partir da cor corrente
    glEnable(GL_COLOR_MATERIAL);
    //Habilita o uso de iluminação
    glEnable(GL_LIGHTING);
    // Habilita a luz de número 0
    glEnable(GL_LIGHT0);
   
   
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   

    glFrontFace(GL_CCW);
   
   
   
    glCullFace (GL_BACK);
    //glEnable (GL_CULL_FACE);
   
   
   
    carregar_texturas();
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
 
   
   
    constroi_tads(12);
   
   

    glutMainLoop();  // inicia o motor de eventos da GLUT
   
   
    return 0;
}

void Teclado(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 27:
        {
            glutLeaveMainLoop();
            break;
        }
       
        case 65:
        case 97:
        {
            pos_x-=1;
            break;
        }
        case 68:
        case 100:
        {
            pos_x+=1;
            break;
        }
       
        case 87:
        case 119:
        {
            pos_z-=1;
            break;
        }
        case 83:
        case 115:
        {
            pos_z+=1;
            break;
        }
       
        case 81:
        case 113:
        {
            pos_y-=1;
            break;
        }
        case 69:
        case 101:
        {
            pos_y+=1;
            break;
        }
    }
}

void TecladoEspecial(int key, int x, int y)
{
    switch(key)
    {
        case GLUT_KEY_LEFT:
        {
            ang_y-=5;
            break;
        }
       
        case GLUT_KEY_RIGHT:
        {
            ang_y+=5;
            break;
        }
       
        case GLUT_KEY_UP:
        {
            ang_x+=5;
            break;
        }
       
        case GLUT_KEY_DOWN:
        {
            ang_x-=5;
            break;
        }
    }
}

void timer_0 (int _valor)
{
   
    glutTimerFunc(20, timer_0, 0);
    angulo += 0.5;
}

void timer_1 (int _valor)
{   
    glutTimerFunc(1000, timer_1, 0);
    printf("fps: %d\n", fps_cont);
    fps_cont = 0;
}

   

void Idle (void)
{
    glutPostRedisplay();
}


void OnResize(int w, int h)
{
    float porprocao;

    printf("%d  %d\n", w, h);//apenas debug
   
    // Evita a divisao por zero
    if(h == 0)
    {
        h = 1;
    }
    porprocao =  (float)w/(float)h;
   
   
    // Especifica as dimensões da Área de Visualização
    glViewport(0, 0, w, h);   
   

    // Inicializa o sistema de coordenadas
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(50, porprocao, 0.1, 1000);
   
    //corrige perpectiva - realmente melhora? ???*
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

}

void desenha_cubo(float tamanho)
{
    tamanho /= 2.0;

    glBegin(GL_QUADS);
        // Face posterior
        glNormal3f(0.0, 0.0, -1.0);// Normal da face
        glVertex3f(tamanho, tamanho, -tamanho);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glVertex3f(-tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face frontal
        glNormal3f(0.0, 0.0, 1.0);// Normal da face       
        glVertex3f(-tamanho, tamanho, tamanho);
        glVertex3f(-tamanho, -tamanho, tamanho);
        glVertex3f(tamanho, -tamanho, tamanho);
        glVertex3f(tamanho, tamanho, tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face lateral esquerda
        glNormal3f(-1.0, 0.0, 0.0);// Normal da face       
        glVertex3f(-tamanho, tamanho, tamanho);
        glVertex3f(-tamanho, tamanho, -tamanho);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glVertex3f(-tamanho, -tamanho, tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face lateral direita
        glNormal3f(1.0, 0.0, 0.0);// Normal da face
        glVertex3f(tamanho, tamanho, tamanho);
        glVertex3f(tamanho, -tamanho, tamanho);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glVertex3f(tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face superior
        glNormal3f(0.0, 1.0, 0.0);// Normal da face       
        glVertex3f(-tamanho, tamanho, -tamanho);
        glVertex3f(-tamanho, tamanho, tamanho);
        glVertex3f(tamanho, tamanho, tamanho);
        glVertex3f(tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face inferior
        glNormal3f(0.0, -1.0, 0.0);// Normal da face       
        glVertex3f(-tamanho, -tamanho, tamanho);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glVertex3f(tamanho, -tamanho, tamanho);
    glEnd();
}


void constroi_tads (GLfloat _tamanho)
{
    GLfloat tamanho_bloco = ((float)_tamanho/(float)12) * 0.85;
    GLfloat tamanho_metade = ((float)_tamanho/(float)12) * 0.5;
    GLfloat tamanho_total = ((float)_tamanho/(float)12);
   
    lista_tads = glGenLists(1);

    glNewList(lista_tads, GL_COMPILE);
        //desenha a letra T
        glPushMatrix();
        glTranslatef(-tamanho_total*0.6, 0.0, 0.0);
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 5*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix(); 
            glTranslatef(-(tamanho_metade + 3*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();   
           
            glPushMatrix(); 
            glTranslatef(-(tamanho_metade + 4*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
               
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra A
        glPushMatrix();
        glTranslatef(-tamanho_total*0.2, 0.0, 0.0);
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 1*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 1*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra D
        glPushMatrix();
        glTranslatef(tamanho_total*0.2, 0.0, 0.0);
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 1*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 2*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 2*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 1*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra S
        glPushMatrix();
        glTranslatef(tamanho_total*0.6, 0.0, 0.0);
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 4*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 4*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
    glEndList();
}
 

void OnDisplay ()
{
    glClearColor (0.98f, 0.98f, 0.98f, 1.0f);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
   
    //inicializa o sistema de cordenadas
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
   
    //define a posição e alvo da câmera
    gluLookAt(pos_x, pos_y, pos_z,0,0,0,0,1,0);   
   
    /*glRotatef(ang_x,1,0,0);
    glRotatef(ang_y,0,1,0);
    glRotatef(ang_z,0,0,1);
    glTranslatef(pos_x,pos_y,pos_z);*/
   
   
    /*
    glBegin(GL_QUADS);
        glVertex3f(-6.0f, -4.0f, -6.0f);
        glVertex3f(6.0f, -4.0f, -6.0f);
        glVertex3f(6.0f, -4.0f, 6.0f);
        glVertex3f(-6.0f, -4.0f, 6.0f);
    glEnd();
       
   
    glColor4f(0.6f, 0.6f, 0.6f, 1.0f);
     
    glglPushMatrix();
    glTranslatef(-2.0f, 0.0f, 0.0f);
    glRotatef(angulo, 1, 0.8, 0.4);
    glutSolidTeapot(1);
    glglPopMatrix();
   
   
    glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
   
    glglPushMatrix();
    glTranslatef(2.0f, 0.0f, 0.0f);
    glRotatef(angulo, 0.2, 1, -0.5);
    desenha_cubo(1);
    glglPopMatrix();
   
    glRasterPos2i (-2, -2);
    printString("hahaha!");
    */   
   
    glBindTexture(GL_TEXTURE_2D,textura_plano); //define a textura a ser utilizada
   
    glColor4f(0.9f, 0.9f, 0.9f, 1.0f);
   
    glEnable(GL_TEXTURE_2D);
    glBegin(GL_QUADS);  // cria o quadrado texturizado de fundo
        glTexCoord2f(0,0);    glVertex3f(-10.0f, -3.0f, 10.0/1.415);
        glTexCoord2f(1,0);    glVertex3f(10.0f, -3.0f, 10.0/1.415);
        glTexCoord2f(1,1);    glVertex3f(10.0f, -3.0f, -10.0/1.415);
        glTexCoord2f(0,1);    glVertex3f(-10.0f, -3.0f, -10.0/1.415);
    glEnd();
    glDisable(GL_TEXTURE_2D);
   
    glTranslatef(0.0, sin(angulo/5.0)*0.5, 0.0);
    glRotatef(angulo, 0, 1, 0);

    glColor4f(0.1f, 0.9f, 0.1f, 1.0f);
    glCallList(lista_tads);

   
    glFlush();
    glutSwapBuffers();
    fps_cont ++;
}


void carregar_texturas(void)
{
    IMAGE *img;
    GLenum gluerr;

    // constrói uma textura
    glGenTextures(1, &textura_plano);
    glBindTexture(GL_TEXTURE_2D, textura_plano);

    // chama a função de carga de memória do arquivo image.c
    if(!(img=ImageLoad("fundo.rgb")))
    {
        fprintf(stderr,"Error reading a texture.\n");
        exit(-1);
    }

    // constrói mipmaps
    gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)(img->data));
    if(gluerr)
    {
        fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr));
        exit(-1);
    }

    // define parâmetros de texturização
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
}


https://docs.google.com/file/d/0B4m9FQ8snMU3SHhYdGZJWjFEbFE/edit

----------------------------------------------------------------------------------


Última edição por Diego Henrix em Qua Jan 30, 2013 12:02 pm, editado 2 vez(es)

Diego Henrix

Mensagens : 7
Data de inscrição : 04/04/2012

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Um projeto em openGL - Logo do curso em 3D

Mensagem  Diego Henrix em Qua Jan 30, 2013 9:51 am

continuação...

Versão 0.2:




Código:

//gcc tads_logo_0.c -o tads_logo_0 -lm -lGL -lGLU -lglut image.o
#include <GL/freeglut.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "image.h"

float angulo = 0;
int fps_cont = 0;
int cont = 0;
int cont2 = 0;

//display-list para desenho do logo
GLint lista_tads;


//variáveis para posicionamento da câmera
float pos_x = -5.0, pos_y = 5.0, pos_z = 12.0;
float ang_x = 0.0, ang_y = 0.0, ang_z = 0.0;

//funções callback da GLUT
void OnDisplay (void);
void Idle (void);
void OnResize (int w, int h);
void Teclado(unsigned char key, int x, int y);
void TecladoEspecial(int key, int x, int y);
void timer_0 (int _valor);
void timer_1 (int _valor);
void timer_2 (int _valor);

//funções de desenho
void desenha_cubo(float tamanho);
void constroi_tads(GLfloat _tamanho);
void carregar_texturas(void);

//identificadores de texturas
GLint textura_plano;
GLint textura_cubo;


int main (int argc, char * argv [])
{
    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]={1.0, 1.0, 1.0, 1.0};// "brilho"
    GLfloat posicaoLuz[4]={10.0, 10.0, 10.0, 1.0};
    GLfloat especularidade[4]={1.0,1.0,1.0,1.0};// Capacidade de brilho do material
    GLint especMaterial = 60;


    glutInit(&argc, argv);
   
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);   
    glutInitWindowSize(600,480);
    glutInitWindowPosition(600,600);
    glutCreateWindow("Tecnologia em Analise e Desenvolvimento de Sistemas - IF Goiano");
   
    glutDisplayFunc(OnDisplay);
    glutReshapeFunc(OnResize);
    glutKeyboardFunc(Teclado);
    glutSpecialFunc(TecladoEspecial);
    glutIdleFunc(Idle);
    glutTimerFunc(20, timer_0, 0);
    glutTimerFunc(1000, timer_1, 0);

   
    // Habilita e define a função do depth-buffer
    glEnable (GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
   
    //glEnable (GL_POLYGON_SMOOTH); //mostra a malha. Porquê?!?!
    //glEnable (GL_LINE_SMOOTH);
   
    //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
   
    // Habilita o modelo de colorização de Gouraud
    glShadeModel(GL_SMOOTH);
    // Define a refletância do material
    glMaterialfv(GL_FRONT, GL_SPECULAR, especularidade);
    // Define a concentração do brilho
    glMateriali(GL_FRONT, GL_SHININESS,especMaterial);
    // 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 a definição da cor do material a partir da cor corrente
    glEnable(GL_COLOR_MATERIAL);
    //Habilita o uso de iluminação
    glEnable(GL_LIGHTING);
    // Habilita a luz de número 0
    glEnable(GL_LIGHT0);
   
   
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   

    glFrontFace(GL_CCW);
   
   
   
    glCullFace (GL_BACK);
    //glEnable (GL_CULL_FACE);
   
   
   
    carregar_texturas();
 
   
   
    constroi_tads(12);
   
   

    glutMainLoop();  // inicia o motor de eventos da GLUT
   
   
    return 0;
}

void Teclado(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 27:
        {
            glutLeaveMainLoop();
            break;
        }
       
        case 65:
        case 97:
        {
            pos_x-=1;
            break;
        }
        case 68:
        case 100:
        {
            pos_x+=1;
            break;
        }
       
        case 87:
        case 119:
        {
            pos_z-=1;
            break;
        }
        case 83:
        case 115:
        {
            pos_z+=1;
            break;
        }
       
        case 81:
        case 113:
        {
            pos_y-=1;
            break;
        }
        case 69:
        case 101:
        {
            pos_y+=1;
            break;
        }
    }
}

void TecladoEspecial(int key, int x, int y)
{
    switch(key)
    {
        case GLUT_KEY_LEFT:
        {
            ang_y-=5;
            break;
        }
       
        case GLUT_KEY_RIGHT:
        {
            ang_y+=5;
            break;
        }
       
        case GLUT_KEY_UP:
        {
            ang_x+=5;
            break;
        }
       
        case GLUT_KEY_DOWN:
        {
            ang_x-=5;
            break;
        }
    }
}

void timer_0 (int _valor)
{
   
    glutTimerFunc(20, timer_0, 0);
    angulo += 0.5;
}

void timer_1 (int _valor)
{   
    glutTimerFunc(1000, timer_1, 0);
    printf("fps: %d\n", fps_cont);
    fps_cont = 0;
}

   

void Idle (void)
{
    glutPostRedisplay();
}


void OnResize(int w, int h)
{
    float porprocao;

    printf("%d  %d\n", w, h);//apenas debug
   
    // Evita a divisao por zero
    if(h == 0)
    {
        h = 1;
    }
    porprocao =  (float)w/(float)h;
   
   
    // Especifica as dimensões da Área de Visualização
    glViewport(0, 0, w, h);   
   

    // Inicializa o sistema de coordenadas
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(50, porprocao, 0.1, 1000);
   
    //corrige perpectiva - realmente melhora? ???*
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

}

/*
glTexCoord2f(0,0);    glVertex3f(-10.0f, -3.0f, 10.0/1.415);
        glTexCoord2f(1,0);    glVertex3f(10.0f, -3.0f, 10.0/1.415);
        glTexCoord2f(1,1);    glVertex3f(10.0f, -3.0f, -10.0/1.415);
        glTexCoord2f(0,1);    glVertex3f(-10.0f, -3.0f, -10.0/1.415);
        */



void desenha_cubo(float tamanho)
{
    tamanho /= 2.0;


    glBegin(GL_QUADS);
        // Face posterior
        glNormal3f(0.0, 0.0, -1.0);// Normal da face
        glTexCoord2f(0,0);     
        glVertex3f(tamanho, -tamanho, -tamanho);
        glTexCoord2f(1,0);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glTexCoord2f(1,1);
        glVertex3f(-tamanho, tamanho, -tamanho);
        glTexCoord2f(0,1);
       glVertex3f(tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face frontal
        glNormal3f(0.0, 0.0, 1.0);// Normal da face       
        glTexCoord2f(0,0);
        glVertex3f(-tamanho, -tamanho, tamanho);
        glTexCoord2f(1,0);
        glVertex3f(tamanho, -tamanho, tamanho);
        glTexCoord2f(1,1);
        glVertex3f(tamanho, tamanho, tamanho);
        glTexCoord2f(0,1);       
        glVertex3f(-tamanho, tamanho, tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face lateral esquerda
        glNormal3f(-1.0, 0.0, 0.0);// Normal da face
        glTexCoord2f(0,0);
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glTexCoord2f(1,0);
        glVertex3f(-tamanho, -tamanho, tamanho);
        glTexCoord2f(1,1);     
        glVertex3f(-tamanho, tamanho, tamanho);
        glTexCoord2f(0,1);
        glVertex3f(-tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face lateral direita
        glNormal3f(1.0, 0.0, 0.0);// Normal da face
        glTexCoord2f(0,0);
        glVertex3f(tamanho, -tamanho, tamanho);
        glTexCoord2f(1,0);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glTexCoord2f(1,1);     
        glVertex3f(tamanho, tamanho, -tamanho);
        glTexCoord2f(0,1);
        glVertex3f(tamanho, tamanho, tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face superior
        glNormal3f(0.0, 1.0, 0.0);// Normal da face
        glTexCoord2f(0,0);     
        glVertex3f(-tamanho, tamanho, tamanho);
        glTexCoord2f(1,0);
        glVertex3f(tamanho, tamanho, tamanho);
        glTexCoord2f(1,1);
        glVertex3f(tamanho, tamanho, -tamanho);
        glTexCoord2f(0,1);
        glVertex3f(-tamanho, tamanho, -tamanho);
    glEnd();
   
    glBegin(GL_QUADS);
        // Face inferior
        glNormal3f(0.0, -1.0, 0.0);// Normal da face
        glTexCoord2f(0,0);     
        glVertex3f(-tamanho, -tamanho, -tamanho);
        glTexCoord2f(1,0);
        glVertex3f(tamanho, -tamanho, -tamanho);
        glTexCoord2f(1,1);
        glVertex3f(tamanho, -tamanho, tamanho);
        glTexCoord2f(0,1);
        glVertex3f(-tamanho, -tamanho, tamanho);
    glEnd();
}


void constroi_tads (GLfloat _tamanho)
{
    GLfloat tamanho_bloco = ((float)_tamanho/(float)12) * 0.85;
    GLfloat tamanho_metade = ((float)_tamanho/(float)12) * 0.5;
    GLfloat tamanho_total = ((float)_tamanho/(float)12);
   
    lista_tads = glGenLists(1);

    glNewList(lista_tads, GL_COMPILE);
        //desenha a letra T
        glPushMatrix();
        glTranslatef(-tamanho_total*0.6, 0.0, 0.0);
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 5*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix(); 
            glTranslatef(-(tamanho_metade + 3*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();   
           
            glPushMatrix(); 
            glTranslatef(-(tamanho_metade + 4*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
               
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 4*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra A
        glPushMatrix();
        glTranslatef(-tamanho_total*0.2, 0.0, 0.0);
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 1*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 1*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 2*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef(-(tamanho_metade + 0*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra D
        glPushMatrix();
        glTranslatef(tamanho_total*0.2, 0.0, 0.0);
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 1*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 2*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 2*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 0*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 1*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
       
        //desenha a letra S
        glPushMatrix();
        glTranslatef(tamanho_total*0.6, 0.0, 0.0);
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 4*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), (tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), (tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 4*tamanho_total), 0, 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), -(tamanho_metade + 0*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
           
            glPushMatrix();
            glTranslatef((tamanho_metade + 5*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 4*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
            glPushMatrix();
            glTranslatef((tamanho_metade + 3*tamanho_total), -(tamanho_metade + 1*tamanho_total), 0);
            desenha_cubo(tamanho_bloco);
            glPopMatrix();
        glPopMatrix();
       
    glEndList();
}
 

void OnDisplay ()
{
    glClearColor (0.98f, 0.98f, 0.98f, 1.0f);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
   
    //inicializa o sistema de cordenadas
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
   
    //define a posição e alvo da câmera
    gluLookAt(pos_x, pos_y, pos_z,0,0,0,0,1,0);   
   
    /*glRotatef(ang_x,1,0,0);
    glRotatef(ang_y,0,1,0);
    glRotatef(ang_z,0,0,1);
    glTranslatef(pos_x,pos_y,pos_z);*/
   
   
    /*
    glBegin(GL_QUADS);
        glVertex3f(-6.0f, -4.0f, -6.0f);
        glVertex3f(6.0f, -4.0f, -6.0f);
        glVertex3f(6.0f, -4.0f, 6.0f);
        glVertex3f(-6.0f, -4.0f, 6.0f);
    glEnd();
       
   
    glColor4f(0.6f, 0.6f, 0.6f, 1.0f);
     
    glglPushMatrix();
    glTranslatef(-2.0f, 0.0f, 0.0f);
    glRotatef(angulo, 1, 0.8, 0.4);
    glutSolidTeapot(1);
    glglPopMatrix();
   
   
    glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
   
    glglPushMatrix();
    glTranslatef(2.0f, 0.0f, 0.0f);
    glRotatef(angulo, 0.2, 1, -0.5);
    desenha_cubo(1);
    glglPopMatrix();
   
    glRasterPos2i (-2, -2);
    printString("hahaha!");
    */   
   
    glBindTexture(GL_TEXTURE_2D,textura_plano);
    glEnable(GL_TEXTURE_2D);
   
    glColor4f(0.9f, 0.9f, 0.9f, 1.0f);
   
    glBegin(GL_QUADS);
        glTexCoord2f(0,0);    glVertex3f(-10.0f, -3.0f, 10.0f);///1.415);
        glTexCoord2f(1,0);    glVertex3f(10.0f, -3.0f, 10.0f);///1.415);
        glTexCoord2f(1,1);    glVertex3f(10.0f, -3.0f, -10.0f);///1.415);
        glTexCoord2f(0,1);    glVertex3f(-10.0f, -3.0f, -10.0f);///1.415);
    glEnd();
   
    glTranslatef(0.0, sin(angulo/5.0)*0.5, 0.0);
    glRotatef(angulo, 0, 1, 0);

    glColor4f(0.1f, 0.9f, 0.1f, 1.0f);
    glBindTexture(GL_TEXTURE_2D,textura_cubo);
    glCallList(lista_tads);

   
    glFlush();
    glutSwapBuffers();
    fps_cont ++;
}


void carregar_texturas(void)
{
    IMAGE *img = NULL;
    GLenum gluerr;

    // textura do plano
    glGenTextures(1, &textura_plano);
    glBindTexture(GL_TEXTURE_2D, textura_plano);

    if(!(img=ImageLoad("fundo_if.rgb")))
    {
        fprintf(stderr,"Error ao ler textura 0.\n");
        exit(-1);
    }

    gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)(img->data));
    if(gluerr)
    {
        fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr));
        exit(-1);
    }
   
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   
    if(img)
    {
        free(img);
        img = NULL;
    }
   
    // textura do cubo
    glGenTextures(1, &textura_cubo);
    glBindTexture(GL_TEXTURE_2D, textura_cubo);

    if(!(img=ImageLoad("fundo_tads.rgb")))
    {
        fprintf(stderr,"Error ao ler textura 1.\n");
        exit(-1);
    }

    gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)(img->data));
    if(gluerr)
    {
        fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr));
        exit(-1);
    }
   
    if(img)
    {
        free(img);
        img = NULL;
    }

    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
}


https://docs.google.com/file/d/0B4m9FQ8snMU3ZXhjbFprb0NyUVk/edit

-------------------------------------------------------------------------------

*Você deve instalar a biblioteca freeglut. Comando de compilação na primeira linha do código.
**Caso queira usar a biblioteca GLUT (compatível com esse código tbm) use #include <GL/glut.h>
***Estou enviando os arquivos necessários no pacote .zip, as duas ultimas versões precisam de arquivos adicionais como as imagens e o carregador delas.

A intensão agora é continuar evoluindo o código rumo a algo mais moderno em relação a arte gráfica 3D.

Sintam-se livres para usar e modificar o código.

Contribuições, criticas e sugestões são bem vindas.

Valeu... Wink

Diego Henrix

Mensagens : 7
Data de inscrição : 04/04/2012

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum