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
- openGL实现可以动的木头人
- opengl画会动的木头人(stick man)
- Android实现可以揉动的图片
- 情人,流泪的木头人
- arcgis flex api实现提示可以动的天气图标
- html5之可以动的div
- 缓动动画的实现
- irrlicht渲染的一帧(可以把irrlicht修改为纯opengl es实现)
- opengl绘制花环(点的个数可以手动输入) c 实现代码
- 鼠标可以动了。。
- html也可以动
- 用html5的canvas画一个可以动的时钟
- 在 OpenGL中可以激活的性能
- 让HTML表格的边框可以拽动
- 让HTML表格的边框可以拽动
- 使用canvas画一个可以动的时钟
- Java写一个可以跟随鼠标动的眼睛
- OpenGL漫游的实现
- html img图片等比例缩放
- CXF spring 整合
- qt信号signal和槽slot机制
- Android 访问网络系列(二)
- java深度搜索解决破碎的砝码
- openGL实现可以动的木头人
- 执行延迟IOS关于取消延迟执行函数的种种
- 第16周 项目2-去除字符串str1中的特定字符(空格),结果仍保存在原字符串中<指针做参数>
- Mahout相关笔记
- 1、CocoaPods安装和使用教程
- S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构
- 原生JPA简单使用
- 第十六周OJ(2)
- 九度OJ 1334 占座位 (模拟 细心)