模仿的程序 波浪

 

模仿的程序 波浪
2009-04-01 22:25

 

 

#include <glut.h>
#include <glaux.h>
#include <math.h>
#include <stdio.h>

float points[45][45][3];
int wigglle_count = 0;
GLfloat hold;

GLuint texture[1];
GLfloat xrot = 0.0f;
GLfloat yrot = 0.0f;
GLfloat zrot = 0.0f;


AUX_RGBImageRec *LoadBMP(char *Filename)     // Loads A Bitmap Image
{
FILE *File=NULL;          // File Handle

if (!Filename)           // Make Sure A Filename Was Given
{
   return NULL;          // If Not Return NULL
}

File=fopen(Filename,"r");        // Check To See If The File Exists

if (File)            // Does The File Exist?
{
   fclose(File);          // Close The Handle
   return auxDIBImageLoad(Filename);     // Load The Bitmap And Return A Pointer
}

return NULL;           // If Load Failed Return NULL
}

int LoadGLTextures()          // Load Bitmaps And Convert To Textures
{
int Status=FALSE;          // Status Indicator

AUX_RGBImageRec *TextureImage[1];      // Create Storage Space For The Texture

memset(TextureImage,0,sizeof(void *)*1);           // Set The Pointer To NULL

// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP("Tim.bmp"))
{
   Status=TRUE;          // Set The Status To TRUE
  
   glGenTextures(1, &texture[0]);      // Create The Texture
  
   // Typical Texture Generation Using Data From The Bitmap
   glBindTexture(GL_TEXTURE_2D, texture[0]);
   glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}

if (TextureImage[0])          // If Texture Exists
{
   if (TextureImage[0]->data)        // If Texture Image Exists
   {
    free(TextureImage[0]->data);      // Free The Texture Image Memory
   }
  
   free(TextureImage[0]);         // Free The Image Structure
}

return Status;           // Return The Status
}

int init()
{
if (!LoadGLTextures())
{
   return FALSE;
}

glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glPolygonMode(GL_BACK, GL_FILL);
glPolygonMode(GL_FRONT, GL_LINE);

for (int x=0; x<45; x++)
{
   for (int y=0; y<45; y++)
   {
    points[x][y][0] = float((x/5.0f)-4.5f);
    points[x][y][1] = float((y/5.0f)-4.5f);
    points[x][y][2] = float(sin((((x/5.0f)*40.0f)/360.0f)*3.141592654*2.0f));
   }
}

return TRUE;
}

void reshape(int w, int h)
{
if (h==0)
{
   h = 1;
}

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45.0f, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void display()
{
int x,y;
float float_x, float_y, float_xb, float_yb;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0f, 0.0f, -12.0f);

glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
glRotatef(zrot, 0.0f, 0.0f, 1.0f);

glBindTexture(GL_TEXTURE_2D, texture[0]);

glBegin(GL_QUADS);
   for (x=0; x<44; x++)
   {
    for (y=0; y<44; y++)
    {
     float_x = float(x)/44.0f;
     float_y = float(y)/44.0f;
     float_xb = float(x+1)/44.0f;
     float_yb = float(y+1)/44.0f;

     glTexCoord2f( float_x, float_y);
     glVertex3f( points[x][y][0], points[x][y][1], points[x][y][2] );
    
     glTexCoord2f( float_x, float_yb );
     glVertex3f( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2] );
    
     glTexCoord2f( float_xb, float_yb );
     glVertex3f( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1][2] );
    
     glTexCoord2f( float_xb, float_y );
     glVertex3f( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2] );

    }
   }
glEnd();

if ( wigglle_count == 2)
{
   for (y=0; y<45; y++)
   {

    hold = points[0][y][2];
    for(x=0; x<44; x++)
    {
     points[x][y][2] = points[x+1][y][2];
    }
    points[44][y][2]=hold;
   }

   wigglle_count = 0;
}

wigglle_count++;

xrot += 0.3f;
yrot += 0.2f;
zrot += 0.4f;

if (xrot > 360.0f)
{
   xrot = 0.0f;
}
if (yrot > 360.0f)
{
   yrot = 0.0f;
}
if (zrot > 360.0f)
{
   zrot =0.0f;
}

glutSwapBuffers();

}


int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(10, 10);
glutInitWindowSize(800,600);
glutCreateWindow("wave");

init();

glutDisplayFunc(display);
glutIdleFunc(display);
glutReshapeFunc(reshape);

glutMainLoop();

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值