我修改了一下程序,可是运行后就看不到物体了float heading=0.0, lookupdown=0.0;
float beginX, beginY, currentX, currentY;
GLfloat yrot;
typedef struct {
GLubyte *p;
unsigned int height;
unsigned int width;
} IMGREC;
struct matrix{
float x;
float y;
float z;
} Position;IMGREC *image[2];typedef struct {
char id[2];
long int filesize;
long int reserved;
long int headersize;
long int infoSize;
long int width;
long int depth;
short int biPlanes;
short int bits;
char biCompression;
long int biSizeImage;
long int biXPelsPerMeter;
long int biYPelsPerMeter;
long int biClrUsed;
long int biClrImportant;
} BMPREC;void loadbmp(char *name,IMGREC *img)
{
FILE *fp;
BMPREC data;
int psize;
int i;
GLubyte temp;
if ((fp=fopen(name,"rb"))==NULL)
{
printf("Can't open file.\n");
exit(-1);
}
fread(&(data.id[0]),sizeof(char),1,fp);
fread(&(data.id[1]),sizeof(char),1,fp);
fread(&(data.filesize),sizeof(long int),1,fp);
fread(&(data.reserved),sizeof(long int),1,fp);
fread(&(data.headersize),sizeof(long int),1,fp);
fread(&(data.infoSize),sizeof(long int),1,fp);
fread(&(data.width),sizeof(long int),1,fp);
fread(&(data.depth),sizeof(long int),1,fp);
fread(&(data.biPlanes),sizeof(short int),1,fp);
fread(&(data.bits),sizeof(short int),1,fp);
fread(&(data.biCompression),sizeof(char),1,fp);
fread(&(data.biSizeImage),sizeof(long int),1,fp);
fread(&(data.biXPelsPerMeter),sizeof(long int),1,fp);
fread(&(data.biYPelsPerMeter),sizeof(long int),1,fp);
fread(&(data.biClrUsed),sizeof(long int),1,fp);
fread(&(data.biClrImportant),sizeof(long int),1,fp);
if (!((toupper(data.id[0])=='B')&&(toupper(data.id[1])=='M')))
{
printf("File isn't a bitmap file.\n");
exit(-1);
}
if (data.biCompression!=0)
{
printf("Can't support compress bitmap file.\n");
exit(-1);
}
if (data.bits != 24)
{
printf("data.bits = %d\n",data.bits);
printf("Require only 24 bit bitmap file.\n");
exit(-1);
}
psize=data.depth*data.width*3 ;
if ( (img->p=(GLubyte *)malloc(psize)) == NULL)
{
printf("Out of memory.\n");
exit(-1);
}
fread( img->p, sizeof(GLubyte), psize,fp);
for(i=0;i<psize;i+=3)
{
// bgr --> rgb
temp = img->p[i];
img->p[i] = img->p[i+2];
img->p[i+2] = temp;
};
img->width=data.width;
img->height=data.depth;
fclose(fp);
}
void mouse(int button, int state, int x, int y){
if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN){
beginX=x;
beginY=y; }
//reset current x and y values
if(button==GLUT_LEFT_BUTTON && state==GLUT_UP){
currentX=currentX+x-beginX;
currentY=currentY+y-beginY; }
}
void mousemotion(int x, int y){
//currentX + (beginX-x) - direction faced in X
heading = -(x-beginX+currentX)*0.5f;
//currentY + (y-beginY) - direction faced in Y
lookupdown = (y-beginY+currentY)*0.5f;
//rotation about y axis yrot = heading;
}
void init ( void )
{
Position.x=0.0; //initial camera x pos
Position.y=0.0; //height of person
Position.z=-8.0;
GLfloat glfLightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat glfLightDiffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f };
GLfloat glfLightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glLightfv(GL_LIGHT0, GL_AMBIENT, glfLightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, glfLightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR,glfLightSpecular);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
if((image[0] = (IMGREC *)malloc(sizeof(IMGREC))) == NULL)
{
printf("Out of memory.\n");
exit(-1);
}
loadbmp("wood.bmp",image[0]);
glBindTexture(GL_TEXTURE_2D, 0); // bind this texture to id = 0
// set paremeters for this
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}void drawCube()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D); // enable texture
// use wood texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, image[0]->width, image[0]->height,0, GL_RGB, GL_UNSIGNED_BYTE, image[0]->p );
glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, 1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, -1.0, 1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, -1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, 1.0, -1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(-1.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(1.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd();
}void display ( void )
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat xtrans = -Position.x;
GLfloat ztrans = -Position.z;
GLfloat ytrans = -Position.y;
GLfloat sceneroty = 360.0f - yrot;
glRotatef(lookupdown,1.0f,0,0);
glRotatef(sceneroty,0,1.0f,0);
glTranslatef(xtrans, ytrans, ztrans); //move objects based on player movement drawCube();
glFlush();
glutSwapBuffers();
}void reshape(int width, int height)
{
GLdouble gldAspect;
gldAspect = width / height;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0,
gldAspect,
1.0,
10.0);
glViewport(0, 0, width, height);
}void keyboard ( unsigned char key, int x, int y )
{
switch ( key ) {
case 'f':
glutFullScreen ( );
break;
case 'w':
glutReshapeWindow ( 250,250 );
break;
default:
break;
}
}void idle_func()
{
glutPostRedisplay();
}int main ( int argc, char** argv )
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(250, 250);
glutCreateWindow(argv[0]);
init();
glutMouseFunc(mouse);
glutMotionFunc(mousemotion);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutIdleFunc(idle_func);
glutMainLoop();
return 0;
}
float beginX, beginY, currentX, currentY;
GLfloat yrot;
typedef struct {
GLubyte *p;
unsigned int height;
unsigned int width;
} IMGREC;
struct matrix{
float x;
float y;
float z;
} Position;IMGREC *image[2];typedef struct {
char id[2];
long int filesize;
long int reserved;
long int headersize;
long int infoSize;
long int width;
long int depth;
short int biPlanes;
short int bits;
char biCompression;
long int biSizeImage;
long int biXPelsPerMeter;
long int biYPelsPerMeter;
long int biClrUsed;
long int biClrImportant;
} BMPREC;void loadbmp(char *name,IMGREC *img)
{
FILE *fp;
BMPREC data;
int psize;
int i;
GLubyte temp;
if ((fp=fopen(name,"rb"))==NULL)
{
printf("Can't open file.\n");
exit(-1);
}
fread(&(data.id[0]),sizeof(char),1,fp);
fread(&(data.id[1]),sizeof(char),1,fp);
fread(&(data.filesize),sizeof(long int),1,fp);
fread(&(data.reserved),sizeof(long int),1,fp);
fread(&(data.headersize),sizeof(long int),1,fp);
fread(&(data.infoSize),sizeof(long int),1,fp);
fread(&(data.width),sizeof(long int),1,fp);
fread(&(data.depth),sizeof(long int),1,fp);
fread(&(data.biPlanes),sizeof(short int),1,fp);
fread(&(data.bits),sizeof(short int),1,fp);
fread(&(data.biCompression),sizeof(char),1,fp);
fread(&(data.biSizeImage),sizeof(long int),1,fp);
fread(&(data.biXPelsPerMeter),sizeof(long int),1,fp);
fread(&(data.biYPelsPerMeter),sizeof(long int),1,fp);
fread(&(data.biClrUsed),sizeof(long int),1,fp);
fread(&(data.biClrImportant),sizeof(long int),1,fp);
if (!((toupper(data.id[0])=='B')&&(toupper(data.id[1])=='M')))
{
printf("File isn't a bitmap file.\n");
exit(-1);
}
if (data.biCompression!=0)
{
printf("Can't support compress bitmap file.\n");
exit(-1);
}
if (data.bits != 24)
{
printf("data.bits = %d\n",data.bits);
printf("Require only 24 bit bitmap file.\n");
exit(-1);
}
psize=data.depth*data.width*3 ;
if ( (img->p=(GLubyte *)malloc(psize)) == NULL)
{
printf("Out of memory.\n");
exit(-1);
}
fread( img->p, sizeof(GLubyte), psize,fp);
for(i=0;i<psize;i+=3)
{
// bgr --> rgb
temp = img->p[i];
img->p[i] = img->p[i+2];
img->p[i+2] = temp;
};
img->width=data.width;
img->height=data.depth;
fclose(fp);
}
void mouse(int button, int state, int x, int y){
if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN){
beginX=x;
beginY=y; }
//reset current x and y values
if(button==GLUT_LEFT_BUTTON && state==GLUT_UP){
currentX=currentX+x-beginX;
currentY=currentY+y-beginY; }
}
void mousemotion(int x, int y){
//currentX + (beginX-x) - direction faced in X
heading = -(x-beginX+currentX)*0.5f;
//currentY + (y-beginY) - direction faced in Y
lookupdown = (y-beginY+currentY)*0.5f;
//rotation about y axis yrot = heading;
}
void init ( void )
{
Position.x=0.0; //initial camera x pos
Position.y=0.0; //height of person
Position.z=-8.0;
GLfloat glfLightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat glfLightDiffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f };
GLfloat glfLightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glLightfv(GL_LIGHT0, GL_AMBIENT, glfLightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, glfLightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR,glfLightSpecular);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
if((image[0] = (IMGREC *)malloc(sizeof(IMGREC))) == NULL)
{
printf("Out of memory.\n");
exit(-1);
}
loadbmp("wood.bmp",image[0]);
glBindTexture(GL_TEXTURE_2D, 0); // bind this texture to id = 0
// set paremeters for this
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}void drawCube()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D); // enable texture
// use wood texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, image[0]->width, image[0]->height,0, GL_RGB, GL_UNSIGNED_BYTE, image[0]->p );
glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, 1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, -1.0, 1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, -1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, 1.0, -1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(-1.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(1.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd();
}void display ( void )
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat xtrans = -Position.x;
GLfloat ztrans = -Position.z;
GLfloat ytrans = -Position.y;
GLfloat sceneroty = 360.0f - yrot;
glRotatef(lookupdown,1.0f,0,0);
glRotatef(sceneroty,0,1.0f,0);
glTranslatef(xtrans, ytrans, ztrans); //move objects based on player movement drawCube();
glFlush();
glutSwapBuffers();
}void reshape(int width, int height)
{
GLdouble gldAspect;
gldAspect = width / height;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0,
gldAspect,
1.0,
10.0);
glViewport(0, 0, width, height);
}void keyboard ( unsigned char key, int x, int y )
{
switch ( key ) {
case 'f':
glutFullScreen ( );
break;
case 'w':
glutReshapeWindow ( 250,250 );
break;
default:
break;
}
}void idle_func()
{
glutPostRedisplay();
}int main ( int argc, char** argv )
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(250, 250);
glutCreateWindow(argv[0]);
init();
glutMouseFunc(mouse);
glutMotionFunc(mousemotion);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutIdleFunc(idle_func);
glutMainLoop();
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货