openGL实现可以动的木头人

来源:互联网 发布:java socket连接 编辑:程序博客网 时间:2024/05/16 08:56

     这是我们计算机图形学的第二个project,刚刚接触计算机图形学,openGL什么都不懂,废了很长时间才如期交了项目。下面就将整个过程记录下来。

     openGL是基于C语言的,我个人认为,它就是一个处理和玩耍图形的函数库。这些函数都是大牛们研究发明出来的,老师给我们讲texture讲了四节课,你使用的话只要几行代码就完成了。如果让我们写个texture映射的函数,或者写个光照函数,那就呵呵了。在此推荐一个openGL很火很有用的教程:

http://users.polytech.unice.fr/~buffa/cours/synthese_image/DOCS/Tutoriaux/Nehe/opengl.htm

这是英文的,不要怕,这只是用来装逼的,有人进行了原版翻译,就在下面:

http://www.yakergong.net/nehe/

熟悉熟悉openGL就开始干了,摸索摸索。

先看main()方法:

int main(int argc, char **argv) {      glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);    /* get a 640 x 480 window */  glutInitWindowSize(640, 480);    /* the window starts at the upper left corner of the screen */  glutInitWindowPosition(0, 0);    /* Open a window */    window = glutCreateWindow("STICK PERSON");    /* Register the function to do all our OpenGL drawing. */  glutDisplayFunc(&DrawGLScene);    /* Go fullscreen.  This is as soon as possible. */  glutFullScreen();  /* Even if there are no events, redraw our gl scene. */  glutIdleFunc(&DrawGLScene);  /* Register the function called when our window is resized. */  glutReshapeFunc(&ReSizeGLScene);  /* Register the function called when the keyboard is pressed. */  glutKeyboardFunc(&keyPressed);  /* Initialize our window. */  InitGL(640, 480);    /* Start Event Processing Engine */    glutMainLoop();    return 1;}
尽管每行都有注释,其实我一行也不懂。这些都是一个教程源码里的,main()方法大多是做了一些初始化。你的工作大部分都在DrawGLScense上,这个就是画的函数。我做这个实验的时候就是从一个教程上的源码改起,利用他的框架和初始化,我只在DrawGLScense()方法里活动。听上去比较猥琐,但是对于急着赶着交的同学还是比较实在的。下面介绍的就是DrawGLScense()方法:

void DrawGLScene(){  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   glLoadIdentity();  glTranslatef(0.0f,0.0f,-40.0f);  glRotatef(angle,0,1,0);  glPushMatrix();  glTranslatef(0.0f,0.0f,-20.0f);  glRotatef(-90,0,1,0);  glPushMatrix();  glTranslatef(0.0f,1.2f,0.0f);  glPushMatrix();  glTranslatef(0.8,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleoflarma,1,0,0);  glPushMatrix();  glTranslatef(0.0,-0.8,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(-90,1,0,0);  DrawArmA();  glPopMatrix();  DrawArmB();  glPopMatrix();    glPushMatrix();  glTranslatef(-0.8,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleofrarma,1,0,0);  glPushMatrix();  glTranslatef(0.0,-0.8,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(-90,1,0,0);  DrawArmA();  glPopMatrix();  DrawArmB();  glPopMatrix();  //return shoulder  glPushMatrix();  glTranslatef(0.0,0.3,0.0);  glPushMatrix();  glTranslatef(0.0,0.7,0.0);  DrawHead();  glPopMatrix();  DrawNick();  glPopMatrix();  DrawShoulder();  glPopMatrix();  //return body  glPushMatrix();  glTranslatef(0.0f,-1.2f,0.0f);  glPushMatrix();  glTranslatef(0.4,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleoflleg,1,0,0);  DrawLeg();  glPopMatrix();  glPushMatrix();  glTranslatef(-0.4,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleofrleg,1,0,0);  DrawLeg();  glPopMatrix();  DrawWaise();  glPopMatrix();  DrawBody();  glPopMatrix();  glPopMatrix();  angleoflarma += a;  angleofrarma -= a;  angleoflleg -= b;  angleofrleg += b;  angle += 0.1;    if(angleoflarma > 50){  a = -1.0;  b = -0.5;  }  if(angleoflarma < -50){  a = 1.0;  b = 0.5;  }  glutSwapBuffers();}/* The function called whenever a key is pressed. */void keyPressed(unsigned char key, int x, int y) {    /* avoid thrashing this procedure */    usleep(100);    /* If escape is pressed, kill everything. */    if (key == ESCAPE)     { /* shut down our window */glutDestroyWindow(window); /* exit the program...normal termination. */exit(0);                       }}
这是有点长,让我理一理,因为我们要画成一个木头人,必然有胳膊有腿,而且是三维的。代码中drawBody(),drawArm()等方法就是画长方体的。现在该说一下画的流程了。在此之前还应该说一下glPopMatrix()和glPushMatrix(),因为人是有关节的。小胳膊活动的时候必须以大胳膊的下面为中心,而大胳膊又得以肩膀为中心。这听上去很复杂,当大胳膊动了,小胳膊咋办?这时就得靠层次来解决了。pop和push就是来体现层次的。

我们先调整一下当前的原点,

glLoadIdentity();

将原点置于屏幕中央。为了便于小人转圈活动,

  glTranslatef(0.0f,0.0f,-40.0f);  glRotatef(angle,0,1,0);  glPushMatrix();  glTranslatef(0.0f,0.0f,-20.0f);  glRotatef(-90,0,1,0);
你可以先不管这几行。关键来了,下一行是:

 glPushMatrix();  glTranslatef(0.0f,1.2f,0.0f);  glPushMatrix();  glTranslatef(0.8,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleoflarma,1,0,0);  glPushMatrix();  glTranslatef(0.0,-0.8,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(-90,1,0,0);  DrawArmA();  glPopMatrix();  DrawArmB();  glPopMatrix();
push就将上面的那些工作保留,并展开新的一层。这一层是基于下一层的,如果下面那层经行了某种变化,比如平移旋转,这整个一层也会跟着变化。push之后来到新的一层,此时画笔原点仍和上一层重合,我们向上移动1.2,原点就到了肩膀的中心。此时,我们先不画肩膀,再次push,右移0.8,下移0.4,到了肩膀和大胳膊连接的地方,我们还不画,再次push,下移0.8,下移0.4,到了小胳膊和大胳膊的连接处,此时,我们到了末端,可以drawArmA()了,drawArmA()就是画一个长方体。注意我们移动的时候移动的都是原点,对于小胳膊这层,中心就在大胳膊和小胳膊的连接处。此时,pop,就到了大胳膊一层,此时原点在大胳膊和肩膀的连接处,drawArmB(),再pop,此时回到了肩膀这层,原点在肩膀中心位置。再次push保留本层,去画另一个胳膊。按照这个层次节奏画完头脖子等部位。其中的
  glRotatef(angleoflarma,1,0,0);
这种就是让小人活动的。你可以先不加入。废话太多,附上全部源码,包含一个面部贴图,是一个笑脸。

/* This code was created by GuozhengWEI Molofee '14  Visit me at www.sduwgz.sinaapp.com  (email gzwei@mail.sdu.edu.cn)*/#include <GL/glut.h>    #include <GL/gl.h>#include <GL/glu.h>#include <unistd.h> #include <stdio.h>    /* ascii code for the escape key */#define ESCAPE 27/* The number of our GLUT window */int window; /* Same parameters in drawfunction */float angleoflarma,angleoflarmb,angleofrarma,angleofrarmb,angleoflleg,angleofrleg,a = 1.0,b=0.5,angle = 1.0;GLuint texture[1];/* Image type - contains height, width, and data */struct Image {    unsigned long sizeX;    unsigned long sizeY;    char *data;};typedef struct Image Image;// quick and dirty bitmap loader...for 24 bit bitmaps with 1 plane only.// See http://www.dcs.ed.ac.uk/~mxr/gfx/2d/BMP.txt for more info.int ImageLoad(char *filename, Image *image) {    FILE *file;    unsigned long size;                 // size of the image in bytes.    unsigned long i;                    // standard counter.    unsigned short int planes;          // number of planes in image (must be 1)    unsigned short int bpp;             // number of bits per pixel (must be 24)    char temp;                          // temporary color storage for bgr-rgb conversion.    // make sure the file is there.    if ((file = fopen(filename, "rb"))==NULL)    {printf("File Not Found : %s\n",filename);return 0;    }    // seek through the bmp header, up to the width/height:    fseek(file, 18, SEEK_CUR);    // read the width    if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {printf("Error reading width from %s.\n", filename);return 0;    }    printf("Width of %s: %lu\n", filename, image->sizeX);    // read the height    if ((i = fread(&image->sizeY, 4, 1, file)) != 1) {printf("Error reading height from %s.\n", filename);return 0;    }    printf("Height of %s: %lu\n", filename, image->sizeY);    // calculate the size (assuming 24 bits or 3 bytes per pixel).    size = image->sizeX * image->sizeY * 3;    // read the planes    if ((fread(&planes, 2, 1, file)) != 1) {printf("Error reading planes from %s.\n", filename);return 0;    }    if (planes != 1) {printf("Planes from %s is not 1: %u\n", filename, planes);return 0;    }    // read the bpp    if ((i = fread(&bpp, 2, 1, file)) != 1) {printf("Error reading bpp from %s.\n", filename);return 0;    }    if (bpp != 24) {printf("Bpp from %s is not 24: %u\n", filename, bpp);return 0;    }    // seek past the rest of the bitmap header.    fseek(file, 24, SEEK_CUR);    // read the data.    image->data = (char *) malloc(size);    if (image->data == NULL) {printf("Error allocating memory for color-corrected image data");return 0;    }    if ((i = fread(image->data, size, 1, file)) != 1) {printf("Error reading image data from %s.\n", filename);return 0;    }    for (i=0;i<size;i+=3) { // reverse all of the colors. (bgr -> rgb)temp = image->data[i];image->data[i] = image->data[i+2];image->data[i+2] = temp;    }    // we're done.    return 1;}// Load Bitmaps And Convert To Texturesvoid LoadGLTextures() {    // Load Texture    Image *image1;    // allocate space for texture    image1 = (Image *) malloc(sizeof(Image));    if (image1 == NULL) {printf("Error allocating space for image");exit(0);    }    if (!ImageLoad("larry.bmp", image1)) {exit(1);    }    // Create Texture    glGenTextures(1, &texture[0]);    glBindTexture(GL_TEXTURE_2D, texture[0]);   // 2d texture (x and y size)    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture    glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data);};// A general OpenGL initialization function.  Sets all of the initial parameters.void InitGL(int Width, int Height)       {  LoadGLTextures();    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  glClearDepth(1.0);  glDepthFunc(GL_LESS);  glEnable(GL_DEPTH_TEST);  glEnable(GL_TEXTURE_2D);  glShadeModel(GL_SMOOTH);  glMatrixMode(GL_PROJECTION);  glLoadIdentity();  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);  glMatrixMode(GL_MODELVIEW);}// The function called when our window is resizedvoid ReSizeGLScene(int Width, int Height){  if (Height==0)        Height=1;  glViewport(0, 0, Width, Height);  glMatrixMode(GL_PROJECTION);  glLoadIdentity();  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);  glMatrixMode(GL_MODELVIEW);}//DrawFunction for every partvoid DrawBody(){  glColor3f(1.0f,1.0f,1.0f);  glBegin(GL_QUADS);  //forward    glVertex3f(-0.5f, 1.0f, 0.25f);    glVertex3f( 0.5f, 1.0f, 0.25f);    glVertex3f( 0.5f,-1.0f, 0.25f);    glVertex3f(-0.5f,-1.0f, 0.25f);  //left    glVertex3f( 0.5f, 1.0f, 0.25f);    glVertex3f( 0.5f, 1.0f,-0.25f);    glVertex3f( 0.5f,-1.0f,-0.25f);    glVertex3f( 0.5f,-1.0f, 0.25f);  //back    glVertex3f( 0.5f, 1.0f,-0.25f);    glVertex3f(-0.5f, 1.0f,-0.25f);    glVertex3f(-0.5f,-1.0f,-0.25f);    glVertex3f( 0.5f,-1.0f,-0.25f);  //right    glVertex3f(-0.5f, 1.0f, 0.25f);    glVertex3f(-0.5f, 1.0f,-0.25f);    glVertex3f(-0.5f,-1.0f,-0.25f);    glVertex3f(-0.5f,-1.0f, 0.25f);   //top    glVertex3f( 0.5f, 1.0f, 0.25f);    glVertex3f( 0.5f, 1.0f,-0.25f);    glVertex3f(-0.5f, 1.0f,-0.25f);    glVertex3f(-0.5f, 1.0f, 0.25f);  //bottom    glVertex3f( 0.5f,-1.0f, 0.25f);    glVertex3f( 0.5f,-1.0f,-0.25f);    glVertex3f(-0.5f,-1.0f,-0.25f);    glVertex3f(-0.5f,-1.0f, 0.25f);    glEnd();  } void DrawShoulder(){  glColor3f(1.0f,1.0f,1.0f);  glBegin(GL_QUADS);  //forward    glVertex3f(-1.0f, 0.2f, 0.25f);    glVertex3f( 1.0f, 0.2f, 0.25f);    glVertex3f( 1.0f,-0.2f, 0.25f);    glVertex3f(-1.0f,-0.2f, 0.25f);  //left    glVertex3f( 1.0f, 0.2f, 0.25f);    glVertex3f( 1.0f, 0.2f,-0.25f);    glVertex3f( 1.0f,-0.2f,-0.25f);    glVertex3f( 1.0f,-0.2f, 0.25f);  //back    glVertex3f( 1.0f, 0.2f,-0.25f);    glVertex3f(-1.0f, 0.2f,-0.25f);    glVertex3f(-1.0f,-0.2f,-0.25f);    glVertex3f( 1.0f,-0.2f,-0.25f);  //right    glVertex3f(-1.0f, 0.2f, 0.25f);    glVertex3f(-1.0f, 0.2f,-0.25f);    glVertex3f(-1.0f,-0.2f,-0.25f);    glVertex3f(-1.0f,-0.2f, 0.25f);   //top    glVertex3f( 1.0f, 0.2f, 0.25f);    glVertex3f( 1.0f, 0.2f,-0.25f);    glVertex3f(-1.0f, 0.2f,-0.25f);    glVertex3f(-1.0f, 0.2f, 0.25f);  //bottom    glVertex3f( 1.0f,-0.2f, 0.25f);    glVertex3f( 1.0f,-0.2f,-0.25f);    glVertex3f(-1.0f,-0.2f,-0.25f);    glVertex3f(-1.0f,-0.2f, 0.25f);   glEnd();}void DrawWaise(){  glColor3f(1.0f,1.0f,1.0f);  glBegin(GL_QUADS);    //forward    glVertex3f(-0.7f, 0.2f, 0.25f);    glVertex3f( 0.7f, 0.2f, 0.25f);    glVertex3f( 0.7f,-0.2f, 0.25f);    glVertex3f(-0.7f,-0.2f, 0.25f);  //left    glVertex3f( 0.7f, 0.2f, 0.25f);    glVertex3f( 0.7f, 0.2f,-0.25f);    glVertex3f( 0.7f,-0.2f,-0.25f);    glVertex3f( 0.7f,-0.2f, 0.25f);  //back    glVertex3f( 0.7f, 0.2f,-0.25f);    glVertex3f(-0.7f, 0.2f,-0.25f);    glVertex3f(-0.7f,-0.2f,-0.25f);    glVertex3f( 0.7f,-0.2f,-0.25f);  //right    glVertex3f(-0.7f, 0.2f, 0.25f);    glVertex3f(-0.7f, 0.2f,-0.25f);    glVertex3f(-0.7f,-0.2f,-0.25f);    glVertex3f(-0.7f,-0.2f, 0.25f);   //top    glVertex3f( 0.7f, 0.2f, 0.25f);    glVertex3f( 0.7f, 0.2f,-0.25f);    glVertex3f(-0.7f, 0.2f,-0.25f);    glVertex3f(-0.7f, 0.2f, 0.25f);  //bottom    glVertex3f( 0.7f,-0.2f, 0.25f);    glVertex3f( 0.7f,-0.2f,-0.25f);    glVertex3f(-0.7f,-0.2f,-0.25f);    glVertex3f(-0.7f,-0.2f, 0.25f);   glEnd();}void DrawArmA(){  glColor3f(1.0f,0.0f,0.0f);    glBegin(GL_QUADS);      //forward    glVertex3f(-0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f,-1.0f, 0.25f);    glVertex3f(-0.2f,-1.0f, 0.25f);  //left    glVertex3f( 0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f, 0.2f,-0.25f);    glVertex3f( 0.2f,-1.0f,-0.25f);    glVertex3f( 0.2f,-1.0f, 0.25f);  //back    glVertex3f( 0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f,-1.0f,-0.25f);    glVertex3f( 0.2f,-1.0f,-0.25f);  //right    glVertex3f(-0.2f, 0.2f, 0.25f);    glVertex3f(-0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f,-1.0f,-0.25f);    glVertex3f(-0.2f,-1.0f, 0.25f);   //top    glVertex3f( 0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f, 0.2f, 0.25f);  //bottom    glVertex3f( 0.2f,-0.2f, 0.25f);    glVertex3f( 0.2f,-0.2f,-0.25f);    glVertex3f(-0.2f,-0.2f,-0.25f);    glVertex3f(-0.2f,-0.2f, 0.25f);          glEnd();}void DrawArmB(){  glColor3f(0.0f,0.0f,1.0f);  glBegin(GL_QUADS);    //forward    glVertex3f(-0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f,-1.0f, 0.25f);    glVertex3f(-0.2f,-1.0f, 0.25f);  //left    glVertex3f( 0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f, 0.2f,-0.25f);    glVertex3f( 0.2f,-1.0f,-0.25f);    glVertex3f( 0.2f,-1.0f, 0.25f);  //back    glVertex3f( 0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f,-1.0f,-0.25f);    glVertex3f( 0.2f,-1.0f,-0.25f);  //right    glVertex3f(-0.2f, 0.2f, 0.25f);    glVertex3f(-0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f,-1.0f,-0.25f);    glVertex3f(-0.2f,-1.0f, 0.25f);   //top    glVertex3f( 0.2f, 0.2f, 0.25f);    glVertex3f( 0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f, 0.2f,-0.25f);    glVertex3f(-0.2f, 0.2f, 0.25f);  //bottom    glVertex3f(-0.2f,-1.0f, 0.25f);    glVertex3f( 0.2f,-1.0f, 0.25f);    glVertex3f( 0.2f,-1.0f,-0.25f);    glVertex3f(-0.2f,-1.0f,-0.25f);  glEnd();}void DrawLeg(){  glColor3f(1.0f,0.0f,0.0f);    glBegin(GL_QUADS);    glVertex3f(-0.3f, 0.25f, 0.0f);    glVertex3f( 0.3f, 0.25f, 0.0f);    glVertex3f( 0.3f,-3.0f, 0.0f);    glVertex3f(-0.3f,-3.0f, 0.0f);  //forward    glVertex3f(-0.3f, 0.25f, 0.255f);    glVertex3f( 0.3f, 0.25f, 0.255f);    glVertex3f( 0.3f,-3.0f, 0.255f);    glVertex3f(-0.3f,-3.0f, 0.255f);  //left    glVertex3f( 0.3f, 0.25f, 0.255f);    glVertex3f( 0.3f, 0.25f,-0.255f);    glVertex3f( 0.3f,-3.0f,-0.255f);    glVertex3f( 0.3f,-3.0f, 0.255f);  //back    glVertex3f( 0.3f, 0.25f,-0.255f);    glVertex3f(-0.3f, 0.25f,-0.255f);    glVertex3f(-0.3f,-3.0f,-0.255f);    glVertex3f( 0.3f,-3.0f,-0.255f);  //right    glVertex3f(-0.3f, 0.25f, 0.255f);    glVertex3f(-0.3f, 0.25f,-0.255f);    glVertex3f(-0.3f,-3.0f,-0.255f);    glVertex3f(-0.3f,-3.0f, 0.255f);   //top    glVertex3f( 0.3f, 0.25f, 0.255f);    glVertex3f( 0.3f, 0.25f,-0.255f);    glVertex3f(-0.3f, 0.25f,-0.255f);    glVertex3f(-0.3f, 0.25f, 0.255f);  //bottom    glVertex3f( 0.3f,-3.0f, 0.255f);    glVertex3f( 0.3f,-3.0f,-0.255f);    glVertex3f(-0.3f,-3.0f,-0.255f);    glVertex3f(-0.3f,-3.0f, 0.255f);      glEnd();}void DrawHead(){   glColor3f(1.0f,0.0f,0.0f);    glBegin(GL_QUADS);     //forward    glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.6f, 0.6f, 0.35f);    glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.6f, 0.6f, 0.35f);    glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.6f,-0.6f, 0.35f);    glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.6f,-0.6f, 0.35f);  //left    glVertex3f( 0.6f, 0.6f, 0.35f);    glVertex3f( 0.6f, 0.6f,-0.35f);    glVertex3f( 0.6f,-0.6f,-0.35f);    glVertex3f( 0.6f,-0.6f, 0.35f);  //back    glVertex3f( 0.6f, 0.6f,-0.35f);    glVertex3f(-0.6f, 0.6f,-0.35f);    glVertex3f(-0.6f,-0.6f,-0.35f);    glVertex3f( 0.6f,-0.6f,-0.35f);  //right    glVertex3f(-0.6f, 0.6f, 0.35f);    glVertex3f(-0.6f, 0.6f,-0.35f);    glVertex3f(-0.6f,-0.6f,-0.35f);    glVertex3f(-0.6f,-0.6f, 0.35f);   //top    glVertex3f( 0.6f, 0.6f, 0.35f);    glVertex3f( 0.6f, 0.6f,-0.35f);    glVertex3f(-0.6f, 0.6f,-0.35f);    glVertex3f(-0.6f, 0.6f, 0.35f);  //bottom    glVertex3f( 0.6f,-0.6f, 0.35f);    glVertex3f( 0.6f,-0.6f,-0.35f);    glVertex3f(-0.6f,-0.6f,-0.35f);    glVertex3f(-0.6f,-0.6f, 0.35f);  glEnd();}void DrawNick(){    glColor3f(1.0f,1.0f,1.0f);    glBegin(GL_QUADS);     //forward    glVertex3f(-0.2f, 0.1f, 0.25f);    glVertex3f( 0.2f, 0.1f, 0.25f);    glVertex3f( 0.2f,-0.1f, 0.25f);    glVertex3f(-0.2f,-0.1f, 0.25f);  //left    glVertex3f( 0.2f, 0.1f, 0.25f);    glVertex3f( 0.2f, 0.1f,-0.25f);    glVertex3f( 0.2f,-0.1f,-0.25f);    glVertex3f( 0.2f,-0.1f, 0.25f);  //back    glVertex3f( 0.2f, 0.1f,-0.25f);    glVertex3f(-0.2f, 0.1f,-0.25f);    glVertex3f(-0.2f,-0.1f,-0.25f);    glVertex3f( 0.2f,-0.1f,-0.25f);  //right    glVertex3f(-0.2f, 0.1f, 0.25f);    glVertex3f(-0.2f, 0.1f,-0.25f);    glVertex3f(-0.2f,-0.1f,-0.25f);    glVertex3f(-0.2f,-0.1f, 0.25f);   //top    glVertex3f( 0.2f, 0.1f, 0.25f);    glVertex3f( 0.2f, 0.1f,-0.25f);    glVertex3f(-0.2f, 0.1f,-0.25f);    glVertex3f(-0.2f, 0.1f, 0.25f);  //bottom    glVertex3f( 0.2f,-0.1f, 0.25f);    glVertex3f( 0.2f,-0.1f,-0.25f);    glVertex3f(-0.2f,-0.1f,-0.25f);    glVertex3f(-0.2f,-0.1f, 0.25f);      glEnd();}//The main drawing function. void DrawGLScene(){  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   glLoadIdentity();  glTranslatef(0.0f,0.0f,-40.0f);  glRotatef(angle,0,1,0);  glPushMatrix();  glTranslatef(0.0f,0.0f,-20.0f);  glRotatef(-90,0,1,0);  glPushMatrix();  glTranslatef(0.0f,1.2f,0.0f);  glPushMatrix();  glTranslatef(0.8,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleoflarma,1,0,0);  glPushMatrix();  glTranslatef(0.0,-0.8,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(-90,1,0,0);  DrawArmA();  glPopMatrix();  DrawArmB();  glPopMatrix();    glPushMatrix();  glTranslatef(-0.8,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleofrarma,1,0,0);  glPushMatrix();  glTranslatef(0.0,-0.8,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(-90,1,0,0);  DrawArmA();  glPopMatrix();  DrawArmB();  glPopMatrix();  //return shoulder  glPushMatrix();  glTranslatef(0.0,0.3,0.0);  glPushMatrix();  glTranslatef(0.0,0.7,0.0);  DrawHead();  glPopMatrix();  DrawNick();  glPopMatrix();  DrawShoulder();  glPopMatrix();  //return body  glPushMatrix();  glTranslatef(0.0f,-1.2f,0.0f);  glPushMatrix();  glTranslatef(0.4,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleoflleg,1,0,0);  DrawLeg();  glPopMatrix();  glPushMatrix();  glTranslatef(-0.4,0.0,0.0);  glTranslatef(0.0,-0.4,0.0);  glRotatef(angleofrleg,1,0,0);  DrawLeg();  glPopMatrix();  DrawWaise();  glPopMatrix();  DrawBody();  glPopMatrix();  glPopMatrix();  angleoflarma += a;  angleofrarma -= a;  angleoflleg -= b;  angleofrleg += b;  angle += 0.1;    if(angleoflarma > 50){  a = -1.0;  b = -0.5;  }  if(angleoflarma < -50){  a = 1.0;  b = 0.5;  }  glutSwapBuffers();}/* The function called whenever a key is pressed. */void keyPressed(unsigned char key, int x, int y) {    /* avoid thrashing this procedure */    usleep(100);    /* If escape is pressed, kill everything. */    if (key == ESCAPE)     { /* shut down our window */glutDestroyWindow(window); /* exit the program...normal termination. */exit(0);                       }}int main(int argc, char **argv) {      glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);    /* get a 640 x 480 window */  glutInitWindowSize(640, 480);    /* the window starts at the upper left corner of the screen */  glutInitWindowPosition(0, 0);    /* Open a window */    window = glutCreateWindow("STICK PERSON");    /* Register the function to do all our OpenGL drawing. */  glutDisplayFunc(&DrawGLScene);    /* Go fullscreen.  This is as soon as possible. */  glutFullScreen();  /* Even if there are no events, redraw our gl scene. */  glutIdleFunc(&DrawGLScene);  /* Register the function called when our window is resized. */  glutReshapeFunc(&ReSizeGLScene);  /* Register the function called when the keyboard is pressed. */  glutKeyboardFunc(&keyPressed);  /* Initialize our window. */  InitGL(640, 480);    /* Start Event Processing Engine */    glutMainLoop();    return 1;}

图片下载

http://img.blog.csdn.net/20141212185620484

你可以下载运行,试试。

0 0