› Foros › Multiplataforma › Desarrollo
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL\gl.h>
#include <GL\glaux.h>
typedef float vec3_t[3];
//CABECERA DEL MD2
struct md2_header_t
{
int ident;
int version;
int skinwidth;
int skinheight;
int framesize;
int num_skins;
int num_vertices;
int num_st;
int num_tris;
int num_glcmds;
int num_frames;
int offset_skins;
int offset_st;
int offset_tris;
int offset_frames;
int offset_glcmds;
int offset_end;
};
//NOMBRE DE LA TEXTURA
struct md2_skin_t
{
char name[64];
};
//CORDENADAS DE LA TEXTURA
struct md2_texCoord_t
{
short s;
short t;
};
// ESTRUCTURA DONDE VAMOS A GUARDAR LOS TRIANGULOS
struct md2_triangle_t
{
unsigned short vertex[3];
unsigned short st[3];
};
//COMPRESION DE VERTICES
struct md2_vertex_t
{
unsigned char v[3];
unsigned char normalIndex;
};
//FRAMES DEL MODELO
struct md2_frame_t
{
vec3_t scale;
vec3_t translate;
char name[16];
struct md2_vertex_t *verts;
};
/* GL command packet */
struct md2_glcmd_t
{
float s;
float t;
int index;
};
//ESTRUCTURA DEL MODELO MD2
struct md2_model_t
{
struct md2_header_t header;
struct md2_skin_t *skins;
struct md2_texCoord_t *texcoords;
struct md2_triangle_t *triangles;
struct md2_frame_t *frames;
int *glcmds;
GLuint tex_id;
};
//TABLA CON LAS NORMALES PRECALCULADAS
vec3_t anorms_table[162] = {
#include "anorms.h"
};
//MODELO MD2
struct md2_model_t md2file;
/* OpenGL texture info */
struct gl_texture_t
{
GLsizei width;
GLsizei height;
GLenum format;
GLint internalFormat;
GLuint id;
GLubyte *texels;
};
#pragma pack(1)
/* PCX header */
struct pcx_header_t
{
GLubyte manufacturer;
GLubyte version;
GLubyte encoding;
GLubyte bitsPerPixel;
GLushort xmin, ymin;
GLushort xmax, ymax;
GLushort horzRes, vertRes;
GLubyte palette[48];
GLubyte reserved;
GLubyte numColorPlanes;
GLushort bytesPerScanLine;
GLushort paletteType;
GLushort horzSize, vertSize;
GLubyte padding[54];
};
#pragma pack(4)
/* Texture id for the demo */
GLuint texId;
double PI = 3.14159265359;
GLfloat xRot = 0.0f;
GLfloat yRot = 0.0f;
GLfloat Rotacion = 0;
GLfloat shadowMat[4][4];
GLfloat lightPos[4] = { -50.0f, 150.0f, -200.0f, 1.0f };
GLint NumeroVertices = 0,NumeroNormales = 0,NumeroTexturas = 0,NumeroFacetas = 0;
GLint Vertical = 0,Horizontal = 0,PRotacion = 3,PrimeraVez = 1;
GLint PCuadroX = 0,PCuadroY = 0,PCuadroZ = 0;
GLfloat PPersonajeX = 0.0f,PPersonajeZ = 0.0f,Bandera = 1;
int ReadMD2Model (const char *filename, struct md2_model_t *mdl);//DEFINIMOS LA FUNCION ReadMD2Model
/*AQUI CREAMOS UNA FUNCION A LA QUE LE TENEMOS QUE PASAR PRIMERO
EL NOMBRE DEL ARCHIVO MD2 QUE QUEREMOS CARGAR Y LUEGO LA ESTRUCTURA
DEL MODELO MD2 COMPLETA OSEA MD2FILE.*/
int ReadMD2Model (const char *filename, struct md2_model_t *mdl)
{
FILE *fp,*FicheroE;
int i;
char Captura[255];
fp = fopen (filename, "rb"); //ABRIMOS EL FICHERO COMO LECTURA DE BITS
if (!fp)//COMPROBAMOS QUE EL FICHERO SE HALLA ABIERTO BIEN
{
fprintf (stderr, "Error: couldn't open \"%s\"!\n", filename);//SI NO MANDAMOS UN ERROR
return 0; //DEVOLVEMOS 0 POR QUE SE A PRODUCIDO UN ERROR
}
fread (&mdl->header, 1, sizeof (struct md2_header_t), fp);//LEEMOS LA CABECERA DESDE EL FICHERO
if ((mdl->header.ident != 844121161) ||
(mdl->header.version != 8))//COMPROBAMOS QUE SEA UN ARCHIVO MD2 VALIDO
{
/* Error! */
fprintf (stderr, "Error: bad version or identifier\n");//SI NO ES ASI MANDAMOS UN ERROR
fclose (fp);//CERRAMOS EL ARCHIVO
return 0;//DEVOLVEMOS 0 POR QUE SE A PRODUCIDO UN ERROR
}
mdl->skins = (struct md2_skin_t *)
malloc (sizeof (struct md2_skin_t) * mdl->header.num_skins);//RESERVAMOS ESPACIO PARA LOS NOMBRES DE TEXTURAS
mdl->texcoords = (struct md2_texCoord_t *)
malloc (sizeof (struct md2_texCoord_t) * mdl->header.num_st);//RESERVAMOS ESPACIO PARA LOS VERTICES DE TEXTURAS
mdl->triangles = (struct md2_triangle_t *)
malloc (sizeof (struct md2_triangle_t) * mdl->header.num_tris);//RESERVAMOS ESPACIO PARA LOS TRIANGULOS QUE FORMAN EL MODELO
mdl->frames = (struct md2_frame_t *)
malloc (sizeof (struct md2_frame_t) * mdl->header.num_frames);//RESERVAMOS ESPACIO PARA LOS FRAMES
mdl->glcmds = (int *)malloc (sizeof (int) * mdl->header.num_glcmds);//RESERVAMOS ESPACIO PARA LAS LISTAS DE COMANDOS GL
fseek (fp, mdl->header.offset_skins, SEEK_SET);//NOS MOVEMOS EN EL FICHERO A LA POSICION DENDE SE ESCUENTRAN LOS NOMBRES DE LAS TEXTURAS
fread (mdl->skins, sizeof (struct md2_skin_t),
mdl->header.num_skins, fp);//LEEMOS LOS NOMBRES DE LAS TEXTURAS Y LOS COLOCAMOS EN mdl->skins
fseek (fp, mdl->header.offset_st, SEEK_SET);//NOS MOVEMOS EN EL FICHERO A LA POSICION DENDE SE ESCUENTRAN LOS VERTICES DE LAS TEXTURAS
fread (mdl->texcoords, sizeof (struct md2_texCoord_t),
mdl->header.num_st, fp);//LEEMOS LOS VERTICES DE LAS TEXTURAS Y LOS COLOCAMOS EN mdl->texcoords
fseek (fp, mdl->header.offset_tris, SEEK_SET);//NOS MOVEMOS EN EL FICHERO A LA POSICION DENDE SE ESCUENTRAN LOS TRIANGULOS
fread (mdl->triangles, sizeof (struct md2_triangle_t),
mdl->header.num_tris, fp);//LEEMOS LOS TRIANGULOS Y LOS COLOCAMOS EN mdl->triangles
fseek (fp, mdl->header.offset_glcmds, SEEK_SET);//NOS MOVEMOS EN EL FICHERO A LA POSICION DENDE SE ESCUENTRAN LOS TRIANGULOS
fread (mdl->glcmds, sizeof (int), mdl->header.num_glcmds, fp);//LEEMOS LAS LISTAS DE COMANDOS GL Y LOS COLOCAMOS EN mdl->glcmds
fseek (fp, mdl->header.offset_frames, SEEK_SET);//NOS MOVEMOS EN EL FICHERO NUEVAMENTE A LA POSICION DENDE SE ESCUENTRAN LOS FRAMES
for (i = 0; i < mdl->header.num_frames; ++i)/*HACEMOS UN FOR PARA LEER TODOS LOS FRAMES CULLO NUMERO ESTA GUARDADO
DENTRO DE header.num_frames ESTO SE REPETIRA MIENTRAS I SEA MENOR AL
NUMERO DE FRAMES DE ESTE MODELO*/
{
mdl->frames[i].verts = (struct md2_vertex_t *)
malloc (sizeof (struct md2_vertex_t) * mdl->header.num_vertices);//RESERVAMOS MEMORIA PARA LOS VERTICES DE CADA FRAME
fread (mdl->frames[i].scale, sizeof (vec3_t), 1, fp);//LEMOS LOS DATOS ESCALA DE ESTE FRAME Y LA PONEMOS EN mdl->frames[i].scale
fread (mdl->frames[i].translate, sizeof (vec3_t), 1, fp);//LEMOS LOS DATOS DE TRASLACION DE ESTE FRAME Y LA PONEMOS EN mdl->frames[i].translate
fread (mdl->frames[i].name, sizeof (char), 16, fp);//LEMOS EL NOMBRE DE ESTE FRAME Y LA PONEMOS EN mdl->frames[i].name
fread (mdl->frames[i].verts, sizeof (struct md2_vertex_t),
mdl->header.num_vertices, fp);//LEMOS LOS VERTICES DE ESTE FRAME Y LA PONEMOS EN mdl->frames[i].verts
}
FicheroE = fopen("texturas.txt","wt");
sprintf(Captura, "Tamano Imagen : %dX%d\n",mdl->header.skinwidth,mdl->header.skinheight);
fputs(Captura,FicheroE);
fclose(FicheroE);
fclose (fp);//CERRAMOS EL ARCHIVO
return 1;//DEVOLVEMOS 1 COMO QUE LA LECTURA DE LOS DATOS DEL ARCHIVO A TENIDO EXITO
}
void CargarTexturas(const char *filename)
{
AUX_RGBImageRec *Imagen;
GLint tex_id;
glGenTextures(1,&tex_id);
glBindTexture(GL_TEXTURE_2D,tex_id);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
Imagen = auxDIBImageLoad(filename);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,Imagen->sizeX,Imagen->sizeY,GL_RGB,GL_UNSIGNED_BYTE,Imagen->data);
}
/*AQUI CREAMOS UNA FUNCION PARA LIBERAR LA MEMORIA QUE TENIAMOS
RESERVADA PARA NUESTRO MODELO A LA QUE LE PASAMOS LA ESTRUCTURA DEL MODELO
MD2 COMPLETA OSEA MD2FILE precedido por &.*/
void FreeModel (struct md2_model_t *mdl)
{
int i;
if (mdl->skins)/*SI mdl->skins TIENE MEMORIA RESERVADA ENTRAMOS ESTO QUIERE DECIR
QUE SI mdl->skins ES DISTINTO DE CERO ES QUE TIENE MEMORIA RESERVADA
Y TENEMOS QUE LIBERARLA EN CASO CONTRARIO NO HARIA FALTA Y PASAMOS AL
SIGUIENTE if*/
{
free (mdl->skins);//LIBERAMOS LA MEMORIA RESERVADA PARA mdl->skins
mdl->skins = NULL;//PONEMOS EL VALOR DE mdl->skins A CERO PASANDOLE NULL
}
if (mdl->texcoords)/*SI mdl->texcoords TIENE MEMORIA RESERVADA ENTRAMOS ESTO QUIERE DECIR
QUE SI mdl->texcoords ES DISTINTO DE CERO ES QUE TIENE MEMORIA RESERVADA
Y TENEMOS QUE LIBERARLA EN CASO CONTRARIO NO HARIA FALTA Y PASAMOS AL
SIGUIENTE if*/
{
free (mdl->texcoords);//LIBERAMOS LA MEMORIA RESERVADA PARA mdl->texcoords
mdl->texcoords = NULL;//PONEMOS EL VALOR DE mdl->texcoords A CERO PASANDOLE NULL
}
if (mdl->triangles)/*SI mdl->triangles TIENE MEMORIA RESERVADA ENTRAMOS ESTO QUIERE DECIR
QUE SI mdl->triangles ES DISTINTO DE CERO ES QUE TIENE MEMORIA RESERVADA
Y TENEMOS QUE LIBERARLA EN CASO CONTRARIO NO HARIA FALTA Y PASAMOS AL
SIGUIENTE if*/
{
free (mdl->triangles);//LIBERAMOS LA MEMORIA RESERVADA PARA mdl->triangles
mdl->triangles = NULL;//PONEMOS EL VALOR DE mdl->triangles A CERO PASANDOLE NULL
}
if (mdl->glcmds)/*SI mdl->glcmds TIENE MEMORIA RESERVADA ENTRAMOS ESTO QUIERE DECIR
QUE SI mdl->glcmds ES DISTINTO DE CERO ES QUE TIENE MEMORIA RESERVADA
Y TENEMOS QUE LIBERARLA EN CASO CONTRARIO NO HARIA FALTA Y PASAMOS AL
SIGUIENTE if*/
{
free (mdl->glcmds);//LIBERAMOS LA MEMORIA RESERVADA PARA mdl->glcmds
mdl->glcmds = NULL;//PONEMOS EL VALOR DE mdl->glcmds A CERO PASANDOLE NULL
}
if (mdl->frames)/*SI mdl->frames TIENE MEMORIA RESERVADA ENTRAMOS ESTO QUIERE DECIR
QUE SI mdl->frames ES DISTINTO DE CERO ES QUE TIENE MEMORIA RESERVADA
Y TENEMOS QUE LIBERARLA EN CASO CONTRARIO NO HARIA FALTA Y PASAMOS AL
SIGUIENTE if*/
{
for (i = 0; i < mdl->header.num_frames; ++i)/*AQUI LA COSA SE COMPLICA UN POCO PERO NO
NEMASIADO OS ACORDAIS DE QUE RESERVAMOS
MEMORIA PARA LOS VERTICES DE CADA FRAME
PUES AHORA LA TENEMOS QUE LIBERAR TAMBIEN
SI NO SEGUIRIA EN MEMORIA ASI QUE VOLVEMOS
A INCLUIR UN FOR CON EL NUMERO DE FRAMES
Y VAMOS LIBERANDO LOS VERTICES DE LA MEMORIA
FRAME POR FRAME*/
{
free (mdl->frames[i].verts);//LIBERAMOS LA MEMORIA RESERVADA PARA mdl->frames[i].verts PARA ES TE FRAME
mdl->frames[i].verts = NULL;//PONEMOS EL VALOR DE mdl->frames[i].verts A CERO PASANDOLE NULL PARA ESTE FRAME
}
free (mdl->frames);/*Y AQUI FINALMENTE UNA VEZ HEMOS LIBERADO TODA LA MEMORIA DE LOS VERTICES DE LOS
DE LOS DISTINTOS FRAMES LIMERAMOS LA MEMORIA RESERVADA PARA mdl->frames*/
mdl->frames = NULL;//PONEMOS EL VALOR DE mdl->frames A CERO PASANDOLE NULL
}
}
/*AQUI CREAMOS UNA FUNCION PARA RENDERIZAR EL MODELO
EN EL FRAME QUE QUERAMOS A ESTA FINCION LE TEMEMOS QUE PASAR
PRIMERO EL NUEMRO DE FRAME QUE QUEREMOS RENDERIZAR Y LUEGO LA
ESTRUCTURA DEL MODELO MD2 COMPLETA OSEA MD2FILE precedido por &.*/
void RenderFrame (int n, const struct md2_model_t *mdl)
{
int i, j;
GLfloat s, t;
vec3_t v;
struct md2_frame_t *pframe;
struct md2_vertex_t *pvert;
if ((n < 0) || (n > mdl->header.num_frames - 1)) /*COMPROBAMOS QUE EL VALOR QUE LE HEMOS PASADO
A LA FUNCION COMO NUMERO DE FRAME NO SE MENOR
QUE 0 POR QUE NO PINTARIA NUNGUN FRAME Y
SEGURAMENTE TENDRIAMOS DESBORDAMIENTO DE BUFFER
NI QUE SEA MAYOR DEL NUMERO DE FRAMES DISPONIBLE
POR QUE NOS PASARIA LO MISMO JAJAJA*/
return;//EN CASO DE QUE EL VALOR SEA MENOR DE 0 O MAYOR DEL NUMERO DE FRAMES VOLVEMOS SIN HACER NADA
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, 1);
//glBindTexture (GL_TEXTURE_2D, mdl->tex_id);//ACTIVAMOS LA TEXTURA
glBegin (GL_TRIANGLES);//COMENZAMOS A PINTAR EL MODELO
for (i = 0; i < mdl->header.num_tris; ++i)/*HACEMOS UN FOR PARA LEER TODOS LOS TRIANGULOS
CULLO NUMERO ESTA GUARDADO DENTRO DE
mdl->header.num_tris ESTO SE REPETIRA MIENTRAS I
SEA MENOR AL NUMERO DE TRIANGULOS DE ESTE MODELO*/
{
for (j = 0; j < 3; ++j)/*HACEMOS UN FOR PARA PODER MODIFICAR LOS VERTICES DE CADA TRIANGULO
Y ASI PODER POSICIONARLOS BIEN EN PANTALLA COMO BIEN SABEIS
UN TRIANGULO CONSTA DE 3 VERTICES PARA PODER DIBUJARLO POR ESO
ESTE FOR SE REPETIRA MIENTRAS J SEA MENOR DE 3 QUE ES EL NUMERO
DE VERTICES POR CADA TRIANGULO*/
{
pframe = &mdl->frames[n];/*PONEMOS EN pframe EL FRAME DESIGNADO POR EL NUMERO QUE HEMOS
PASADO A LA FUNCION EN PRIMER LUGAR*/
pvert = &pframe->verts[mdl->triangles[i].vertex[j]];/*PONEMOS EN pvert LOS PUNTOS QUE
DENOMINAN CADA VERTIC CORESPONDIENTES
A CADA TRIANGULO DEL MODELO EN CADA
VUELTA DEL FOR*/
/* AQUI LO QUE HACEMOS ES DESIGNAL LOS PUNTOS DE CORDENADAS PAR LA TEXTURA
POR CADA VERTICE DEL TRIANGULO Y LOS PONEMOS EN s Y t RESPECTIVAMENTE */
s = (GLfloat)mdl->texcoords[mdl->triangles[i].st[j]].s / mdl->header.skinwidth;
t = (GLfloat)mdl->texcoords[mdl->triangles[i].st[j]].t / mdl->header.skinheight;
glTexCoord2f (s,t);//PONEMOS LAS CORDENADAS DE LA TEXTURA PARA ESTE VERTICE
glNormal3fv (anorms_table[pvert->normalIndex]);//PONEMOS LAS NORMALES PARA ESTE VERTICE
/* AQUI VAMOS A CALCULAR LA POSION REAL DE CADA VERTICE DEL MODELO PARA
PODER VISUALIZARLO EN PANTALLA */
v[0] = (pframe->scale[0] * pvert->v[0]) + pframe->translate[0];/*PONEMOS EN v[0] EL VALOR
"X" DEL VERTICE Y LO SACAMOS
MULTIPLICANDO LA ESCALA POR
LA POSICION "X" DEL VERTICE
Y LE SUMAMOS LA TRASLACION QUE
TIENE "X" Y LISTO FACIL VERDAD*/
v[1] = (pframe->scale[1] * pvert->v[1]) + pframe->translate[1];/*PONEMOS EN v[1] EL VALOR
"Y" DEL VERTICE Y LO SACAMOS
MULTIPLICANDO LA ESCALA POR
LA POSICION "Y" DEL VERTICE
Y LE SUMAMOS LA TRASLACION QUE
TIENE "Y" Y LISTO FACIL VERDAD*/
v[2] = (pframe->scale[2] * pvert->v[2]) + pframe->translate[2];/*PONEMOS EN v[1] EL VALOR
"Z" DEL VERTICE Y LO SACAMOS
MULTIPLICANDO LA ESCALA POR
LA POSICION "Z" DEL VERTICE
Y LE SUMAMOS LA TRASLACION QUE
TIENE "Z" Y LISTO FACIL VERDAD*/
glVertex3fv (v);//PINTAMOS EL VERTICE
}
}
glEnd ();//FINALIZAMOS DE PINTAR EL MODELO
}
void CALLBACK CambioDeTamano(GLsizei w,GLsizei h)
{
if(h == 0){h = 1;}
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,w/h,0.1f,1025.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CALLBACK KeyLeft(void)
{
Rotacion += (3.1415/30.0f);
if(Rotacion > (2.0*PI)) // Keep in bounds
Rotacion = 0.0;
}
void CALLBACK KeyRight(void)
{
Rotacion -= (3.1415/30.0f);
if(Rotacion > (2.0*PI)) // Keep in bounds
Rotacion = 0.0;
}
void CALLBACK KeyUp(void)
{
GLfloat xDelta = 0.0f,zDelta = 0.0f;
xDelta = 10*cos(Rotacion);
zDelta = -10*sin(Rotacion);
PPersonajeX += (float)xDelta;
PPersonajeZ += (float)zDelta;
}
void CALLBACK KeyDown(void)
{
GLfloat xDelta = 0.0f,zDelta = 0.0f;
xDelta = (-10)*cos(Rotacion);
zDelta = -(-10)*sin(Rotacion);
PPersonajeX += (float)xDelta;
PPersonajeZ += (float)zDelta;
}
void Inicio(void)
{
GLfloat points[3][3] = {{ -120.0f, -99.0f, -20.0f },
{ -120.0f, -99.0f, 20.0f },
{ 60.0f, -99.0f, 120.0f }};
GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f };
GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f };
GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glClearColor(0.0f,0.0f,0.0f,1.0f);
//glColor3f(1.0f,1.0f,1.0f);
glShadeModel(GL_SMOOTH);
Rotacion = (PI/2.0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
//glPolygonMode(GL_FRONT,GL_FILL);
// Setup and enable light 0
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT, GL_SPECULAR,specref);
glMateriali(GL_FRONT,GL_SHININESS,128);
ReadMD2Model("play.md2",&md2file);
CargarTexturas("play.bmp");
//LeerObj();
//glFrontFace(GL_CCW);
}
void CALLBACK RenderizarEscena(void)
{
GLfloat x,y,angle;
GLint ipivot = 1;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
gluLookAt(PPersonajeX,5.0f,PPersonajeZ,((PPersonajeX)+(50*(float)(cos(Rotacion)))),1.0f,((PPersonajeZ)-(50*(float)(sin(Rotacion)))),0.0f,1.0f,0.0f);
glPushMatrix();
glTranslatef(-0.0f,-10.0f,-100.0f);
glRotatef (-90.0f, 1.0, 0.0, 0.0);
glRotatef (-90.0f, 0.0, 0.0, 1.0);
glColor3f(1.0f,1.0f,1.0f);
RenderFrame(1,&md2file);
glPopMatrix();
glPushAttrib(GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glPushMatrix();
glTranslatef(lightPos[0],lightPos[1], lightPos[2]);
auxSolidSphere(5.0f);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0f,-100.0f, 0.0f);
glPolygonMode(GL_FRONT,GL_FILL);
glBegin(GL_QUADS);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-4000.0f,-100.0f,-4000.0f);
glVertex3f(-4000.0f,-100.0f,4000.0f);
glVertex3f(8000.0f,-100.0f,4000.0f);
glVertex3f(8000.0f,-100.0f,-4000.0f);
glEnd();
glPopMatrix();
glPopAttrib();
glPopMatrix();
glFlush();
auxSwapBuffers();
}
int main(void)
{
auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA|AUX_DEPTH);
auxInitPosition(100,50,640,480);
auxInitWindow("CARGAR MD2 DE SONIC EN OPENGL");
Inicio();
//LeerObj();
auxReshapeFunc(CambioDeTamano);
auxKeyFunc(AUX_LEFT,KeyLeft);
auxKeyFunc(AUX_RIGHT,KeyRight);
auxKeyFunc(AUX_UP,KeyUp);
auxKeyFunc(AUX_DOWN,KeyDown);
auxMainLoop(RenderizarEscena);
return 0;
}