Saltar para o conteúdo

Programação com OpenGL/Modern OpenGL Tutorial rascunhos

Origem: Wikilivros, livros abertos por um mundo aberto.

Carregador de modelos super simples

[editar | editar código-fonte]
#include <GL/gl.h> // Biblioteca Padrão do OpenGL
#include <GL/glut.h> //Biblioteca Padrão do GLUT, em alguns sistemas ela chama o freeglut sem precisar declarar freeglut.h
#include <stdio.h> // Biblioteca C padrão para controle de entrade e saida.

//Globais

GLuint car; //inteiro especial do OpenGL, os "objetos" gravados no OpenGL são chamados por numero, gravado no próprio OpenGL e não no programa
float carrot; //float para controle de movimentação.

//obj loader - Carregador de objetos

void loadObj(char *fname){ //*fname é nome do arquivo, como é ponteiro é chamado como uma string.
	FILE *fp; //Ponteiro que representa o arquivo dentro desta função
	int read; //inteiro que pegará o numero de parâmetros recebidos da linha
	GLfloat x, y,z; // Float que armazenara os valores de cada linha de x, y, z
	char ch; //primeiro caratere lido de cada linha
	car = glGenLists(1); //Variável global recebendo o numero que representará o objeto no OpenGL.
	fp = fopen(fname, "r"); //instanciando o arquivo em modo somente de leitura
	if(!fp){ //se o fp retornar falso, ou seja não funcionou como deveria
	    printf("can´t open file %s\n", fname); //Reposta dado ao usuário
	    exit(1); //chamando a saída do programa.
	}
    glPointSize(2.0); //Especifica o diâmetro dos pontos.
    glNewList(car,GL_COMPILE); //Especificando que o objeto ficará em uma lista do OpenGL, referenciado pelo numero car.
    {
        glPushMatrix(); //Coloca a matriz posterior como a atual, ou seja aquela que será trabalhada.
        glBegin(GL_POINTS); //Defini que a matriz será representado com pontos.
        while(!(feof(fp))){ //Enquanto não chegar o final do arquivo
            read = fscanf(fp,"%c %f %f %f", &ch,&x,&y,&z); //numero de parâmetros recebidos, além disso coloca valores na variavel ch,x,y,z
            if(read==4&&ch=='v'){ // se o numero de parametros recebidos for 4 e o primeiro carater for v então
                glVertex3f(x,y,z); //Função que manda a linha das matrizes para o OpenGL
            }
        }
        glEnd(); //Fim da composição da Matriz
    }
    glPopMatrix(); //A Matrix anterior não está sendo trabalhada
    glEndList(); //A Lista está pronta.
    fclose(fp); //O arquivo então será fechado
}

//fim do obj loader

void reshape(int w, int h){ //Função chamada toda vez que a janela é redimensionada
    glViewport(0,0,w,h); // Ajustando o visualizador
    glMatrixMode(GL_PROJECTION); // Trabalhando com a matriz de projeção
    glLoadIdentity(); // Iniciando a Matriz de cima
    gluPerspective(60, (GLfloat)w / (GLfloat)h, 0.1,1000.0); //Corrigindo a perspectiva
    //glortho(-25,25,-2,2,0.1,100); //Método alternativo de fazer o mesmo
    glMatrixMode(GL_MODELVIEW);// Voltando a trabalhar com a matriz de modelo
}

void drawCar(){ //Função de movimentação
    glPushMatrix(); //Abrindo as matrizes do modelo
    glTranslatef(0,-40.00,-105); // Funçaõ para movimentar, X, Y, Z
    glColor3f(1.0,0.23,0.27); //Função de para definir cores R,G, B
    glScalef(0.5,0.5,0.5); // Função da escalonar 
    glRotatef(carrot,0,1,0); //Função para rodar grau, e ( x, y, z = sob os eixos que ocorrerá a movimentação)
    glCallList(car); //Chamando o nosso objeto incializado por numero
    glPopMatrix(); // Fechando a matriz
    carrot = carrot+0.6; //Aumentando em mais 0.6 o valor do carrot
    if(carrot>360)carrot=carrot-360; //Se o carrot passar de 360º volte a 0
}

void display(void){ //Função chamada a cada quadro
    glClearColor(0.0,0.0,0.0,1.0); //Cor de fundo
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Limpar tela
    glLoadIdentity(); //Carregar as entidades
    drawCar(); //chamada da função acima.
    glutSwapBuffers(); //auxiliar na troca dos buffers(trabalha com a memoria)
}

int main(int argc, char **argv){ // Função principal
    glutInit(&argc, argv); //Incializando o GLUT
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH); //Definindo o modo, memoria, em RGB, Com profundidade
    glutInitWindowSize(800,450); // Tamanho da Janela
    glutInitWindowPosition(20,20); //Posição inicial da janela
    glutCreateWindow("ObjLoader"); //Nome da Janela
    glutReshapeFunc(reshape); //Chama a função quando a tela for redimensionada
    glutDisplayFunc(display); //Chama a função a cada frame da tela
    glutIdleFunc(display); //Chama esta função quando não estiver fazendo nada.
    loadObj("arquivo.obj"); //Carrega o arquivo .obj
    glutMainLoop(); // Cria um loop que volta para as funções anteriores
    }