我的程序如下
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;