OpenglRobot
2016-04-14 16:58
429 查看
OpenglRobot
该项目使用opengl做的一个机器人,能够行走,旋转,并对机器人贴了图。具体源码请参考我的github实验环境:visual studio 2015
源码解析
// gl_robot2.cpp : 定义控制台应用程序的入口点。 // #define GLUT_DISABLE_ATEXIT_HACK #pragma comment(lib, "legacy_stdio_definitions.lib") #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <gl/glut.h> #include <gl\GLAUX.H> #include <cmath> #define GLOBAL_SIZE 0.5 #define PI 3.1415926 bool isLeft = true; static const GLfloat leg_x = 2.0, leg_y = 0.6, leg_z = 0.5; //腿的坐标系缩放比例 static const GLfloat body_x = 1.2, body_y = 2.4, body_z = 1.8; //身体的坐标系缩放比例 static const GLfloat head_x = 1.0, head_z = 1.2, head_y = 1; //头的半径 static const GLfloat arm_x = 1.6, arm_y = 0.6, arm_z = 0.4; //手臂的坐标系缩放比例 static const GLfloat head_radis = 0.25; static const GLfloat foot_x = 1.0, foot_y = 0.3, foot_z = 0.4; //脚的坐标系缩放比例 static const GLfloat neck_x = head_x / 2, neck_y = head_y, neck_z = head_z / 4; static GLfloat centerX = 0.0, centerY = 0.0, centerZ = 0.0; static GLint angle = 0; //初始的角度为竖直的 static int leftHigherLegAngle = -90, rightHigherLegAngle = -90; static int LeftLowerLegAngle = 90, rightLowerLegAngle = 0; static int leftHigherHandAngle = -90, rightHigherHandAngle = -90; static int leftLowerHandAngle = 0, rightLowerHandAngle = 0; static int leftFootAngle = 0, rightFootAngle = 0; int speed = 1; GLUquadricObj *quadratic; //画三维物体时用到 GLuint g_texture = 0, g_texture_head = 0, g_texture_ground = 0, g_texture_sky = 0; void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); //glCullFace(GL_BACK);//背面裁剪(背面不可见) //glEnable(GL_CULL_FACE);//启用裁剪 glEnable(GL_TEXTURE_2D); quadratic = gluNewQuadric(); gluQuadricNormals(quadratic, GLU_SMOOTH); } //画立方体的函数 void drawCube_head(GLfloat x, GLfloat y, GLfloat z) { GLfloat x1 = 0.5 * x / 2; GLfloat y1 = 0.5 * y / 2; GLfloat z1 = 0.5 * z / 2; glBindTexture(GL_TEXTURE_2D, g_texture_head); glBegin(GL_QUADS); //glPushMatrix(); //画前面 glVertex3f(-x1, y1, z1); glVertex3f(x1, y1, z1); glVertex3f(x1, -y1, z1); glVertex3f(-x1, -y1, z1); //画后面 glVertex3f(-x1, y1, -z1); glVertex3f(x1, y1, -z1); glVertex3f(x1, -y1, -z1); glVertex3f(-x1, -y1, -z1); //画上面 glVertex3f(-x1, y1, z1); glVertex3f(x1, y1, z1); glVertex3f(x1, y1, -z1); glVertex3f(-x1, y1, -z1); //画底面 glVertex3f(-x1, -y1, z1); glVertex3f(x1, -y1, z1); glVertex3f(x1, -y1, -z1); glVertex3f(-x1, -y1, -z1); //画左面 glTexCoord2f(0.0f, 1.0f); glVertex3f(-x1, y1, z1); glTexCoord2f(1.0f, 1.0f); glVertex3f(-x1, y1, -z1); glTexCoord2f(1.0f, 0.0f); glVertex3f(-x1, -y1, -z1); glTexCoord2f(0.0f, 0.0f); glVertex3f(-x1, -y1, z1); //画右面 glVertex3f(x1, y1, z1); glVertex3f(x1, y1, -z1); glVertex3f(x1, -y1, -z1); glVertex3f(x1, -y1, z1); glEnd(); //glPopMatrix(); } void drawCube(GLfloat x, GLfloat y, GLfloat z) { GLfloat x1 = 0.5 * x / 2; GLfloat y1 = 0.5 * y / 2; GLfloat z1 = 0.5 * z / 2; glBindTexture(GL_TEXTURE_2D, g_texture); glBegin(GL_QUADS); //glPushMatrix(); //画前面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-x1, y1, z1); glTexCoord2f(1.0f, 0.0f); glVertex3f(x1, y1, z1); glTexCoord2f(1.0f, 1.0f); glVertex3f(x1, -y1, z1); glTexCoord2f(0.0f, 1.0f); glVertex3f(-x1, -y1, z1); //画后面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-x1, y1, -z1); glTexCoord2f(1.0f, 0.0f); glVertex3f(x1, y1, -z1); glTexCoord2f(1.0f, 1.0f); glVertex3f(x1, -y1, -z1); glTexCoord2f(0.0f, 1.0f); glVertex3f(-x1, -y1, -z1); //画上面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-x1, y1, z1); glTexCoord2f(1.0f, 0.0f); glVertex3f(x1, y1, z1); glTexCoord2f(1.0f, 1.0f); glVertex3f(x1, y1, -z1); glTexCoord2f(0.0f, 1.0f); glVertex3f(-x1, y1, -z1); //画底面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-x1, -y1, z1); glTexCoord2f(1.0f, 0.0f); glVertex3f(x1, -y1, z1); glTexCoord2f(1.0f, 1.0f); glVertex3f(x1, -y1, -z1); glTexCoord2f(0.0f, 1.0f); glVertex3f(-x1, -y1, -z1); //画左面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-x1, y1, z1); glTexCoord2f(1.0f, 0.0f); glVertex3f(-x1, y1, -z1); glTexCoord2f(1.0f, 1.0f); glVertex3f(-x1, -y1, -z1); glTexCoord2f(0.0f, 1.0f); glVertex3f(-x1, -y1, z1); //画右面 glTexCoord2f(0.0f, 0.0f); glVertex3f(x1, y1, z1); glTexCoord2f(1.0f, 0.0f); glVertex3f(x1, y1, -z1); glTexCoord2f(1.0f, 1.0f); glVertex3f(x1, -y1, -z1); glTexCoord2f(0.0f, 1.0f); glVertex3f(x1, -y1, z1); glEnd(); //glPopMatrix(); } int LoadGLTexTures_head(GLuint& unTexture, const char* chFileName) { AUX_RGBImageRec *TextureImage; //保存贴图数据的指针 TextureImage = auxDIBImageLoadA((LPCSTR)"face.bmp"); //TextureImage_head = auxDIBImageLoadA((LPCSTR)"face.bmp"); glGenTextures(1, &unTexture); glBindTexture(GL_TEXTURE_2D, unTexture); //设置纹理的信息, glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //设置滤波为线性滤波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//线性滤波 if (TextureImage)//释放资源 { if (TextureImage->data) { free(TextureImage->data); } free(TextureImage); } return 1; } int LoadGLTexTures(GLuint& unTexture, const char* chFileName) { AUX_RGBImageRec *TextureImage; //保存贴图数据的指针 TextureImage = auxDIBImageLoadA((LPCSTR)"body.bmp"); //TextureImage_head = auxDIBImageLoadA((LPCSTR)"face.bmp"); glGenTextures(1, &unTexture); glBindTexture(GL_TEXTURE_2D, unTexture); //设置纹理的信息, glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //设置滤波为线性滤波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//线性滤波 if (TextureImage)//释放资源 { if (TextureImage->data) { free(TextureImage->data); } free(TextureImage); } return 1; } int LoadGLTexTures_ground(GLuint& unTexture, const char* chFileName) { AUX_RGBImageRec *TextureImage; //保存贴图数据的指针 TextureImage = auxDIBImageLoadA((LPCSTR)"ground.bmp"); //TextureImage_head = auxDIBImageLoadA((LPCSTR)"face.bmp"); glGenTextures(1, &unTexture); glBindTexture(GL_TEXTURE_2D, unTexture); //设置纹理的信息, glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //设置滤波为线性滤波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//线性滤波 if (TextureImage)//释放资源 { if (TextureImage->data) { free(TextureImage->data); } free(TextureImage); } return 1; } int LoadGLTexTures_sky(GLuint& unTexture, const char* chFileName) { AUX_RGBImageRec *TextureImage; //保存贴图数据的指针 TextureImage = auxDIBImageLoadA((LPCSTR)"sky.bmp"); //TextureImage_head = auxDIBImageLoadA((LPCSTR)"face.bmp"); glGenTextures(1, &unTexture); glBindTexture(GL_TEXTURE_2D, unTexture); //设置纹理的信息, glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //设置滤波为线性滤波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//线性滤波 if (TextureImage)//释放资源 { if (TextureImage->data) { free(TextureImage->data); } free(TextureImage); } return 1; } void DrawGround() { GLfloat y = -GLOBAL_SIZE * leg_x * 2 - GLOBAL_SIZE * foot_y; glBindTexture(GL_TEXTURE_2D, g_texture_ground); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(centerX - 20.0f, y, centerZ - 20.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(centerX - 20.0f, y, centerZ + 20.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(centerX + 20.0f, y, centerZ + 20.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(centerX + 20.0f, y, centerZ - 20.0f); glEnd(); } void DrawSky() { GLfloat y = 3.5; GLfloat y1 = -GLOBAL_SIZE * leg_x * 2 - GLOBAL_SIZE * foot_y; glBindTexture(GL_TEXTURE_2D, g_texture_sky); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(centerX - 20.0f, y, centerZ - 20.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(centerX - 20.0f, y, centerZ + 20.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(centerX + 20.0f, y, centerZ + 20.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(centerX + 20.0f, y, centerZ - 20.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(centerX - 20.0f, y, centerZ - 20.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(centerX - 20.0f, y, centerZ + 20.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(centerX - 20.0f, y1, centerZ + 20.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(centerX - 20.0f, y1, centerZ - 20.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(centerX + 20.0f, y, centerZ - 20.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(centerX + 20.0f, y, centerZ + 20.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(centerX + 20.0f, y1, centerZ + 20.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(centerX + 20.0f, y1, centerZ - 20.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(centerX - 20.0f, y, centerZ - 20.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(centerX + 20.0f, y, centerZ - 20.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(centerX + 20.0f, y1, centerZ - 20.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(centerX - 20.0f, y1, centerZ - 20.0f); glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空颜色缓冲和深度缓冲 DrawGround(); DrawSky(); glColor3f(0.8, 0.8, 0.8); glPushMatrix(); //robot的位置和方向设置 glTranslatef(centerX, centerY, centerZ); glRotatef(angle, 0.0, 1.0, 0.0); glColor3f(0.5, 0.5, 0.5); //设置颜色为灰色 glPushMatrix(); //画出左大腿 glColor3f(0.5, 0.5, 0.5); glRotatef((GLfloat)leftHigherLegAngle, 0, 0, 1.0); glTranslatef(0.5*leg_x / 2, 0.0, leg_z * 0.5); glPushMatrix(); glScalef(leg_x, leg_y, leg_z); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glTranslatef(0.5 * leg_x / 2, 0.0, 0.0); //画关节 glPushMatrix(); glTranslatef(0.0, 0.0, -0.5*leg_z / 2); gluCylinder(quadratic, 0.5 * leg_y / 2, 0.5 * leg_y / 2, leg_z * 0.5, 32, 32); glPopMatrix(); glRotatef(LeftLowerLegAngle, 0.0, 0.0, 1.0); //画左小腿 glTranslatef(0.5*leg_x / 2, 0.0, 0.0); glPushMatrix(); glColor3f(0.5, 0.5, 0.5); glScalef(leg_x - 0.2, leg_y - 0.2, leg_z - 0.2); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glTranslatef(0.5*leg_x / 2, 0.0, 0.0); glRotatef(90, 0.0, 0.0, 1.0); glTranslatef(-0.5*foot_x / 2 + 0.5*foot_y / 2, 0.0, 0.0); glRotatef(leftFootAngle, 0.0, 0.0, 1.0); glPushMatrix(); glScalef(foot_x, foot_y, foot_z); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glPopMatrix(); glPushMatrix(); //画出右大腿 glColor3f(0.25, 0.45, 0.25); glRotatef((GLfloat)rightHigherLegAngle, 0, 0, 1.0); glTranslatef(leg_x / 4, 0.0, -leg_z / 2); glPushMatrix(); glScalef(leg_x, leg_y, leg_z); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glTranslatef(leg_x / 4, 0, 0); //画关节 glPushMatrix(); glTranslatef(0.0, 0.0, -leg_z / 4); gluCylinder(quadratic, leg_y / 4, leg_y / 4, leg_z / 2, 32, 32); glPopMatrix(); glRotatef(rightLowerLegAngle, 0.0, 0.0, 1.0); //画左小腿 glTranslatef(leg_x / 4, 0.0, 0.0); glPushMatrix(); glColor3f(0.5, 0.5, 0.5); glScalef(leg_x - 0.2, leg_y - 0.2, leg_z - 0.2); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glTranslatef(leg_x / 4, 0.0, 0.0); glRotatef(90, 0.0, 0.0, 1.0); glTranslatef(-foot_x / 4 + leg_y / 4, 0.0, 0.0); glRotatef(rightFootAngle, 0.0, 0.0, 1.0); glPushMatrix(); glScalef(foot_x, foot_y, foot_z); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glPopMatrix(); // 身体 glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glColor3f(0.65, 0.45, 0.45); glTranslatef(0, body_y / 4, 0.0); drawCube(body_x, body_y, body_z); glPopMatrix(); glPushMatrix(); //脖子 glColor3f(0.25, 0.75, 0.75); glTranslatef(0, 0.5*body_y, 0); glScalef(neck_x, neck_y, neck_z); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); // 头部 glPushMatrix(); glColor3f(0.5, 0.5, 0.5); glTranslatef(0, 0.5*body_y + 0.5*head_y, 0); drawCube_head(head_x, head_y, head_z); glPopMatrix(); glColor3f(0.5, 0.55, 0.55); glPushMatrix(); //画左手 glColor3f(0.5, 0.6, 0.6); glTranslatef(0, 0.5*body_y, 0.0); glRotatef(leftHigherHandAngle, 0.0, 0.0, 1.0); glTranslatef(arm_x / 4, 0.0, (body_z + arm_z) / 4); glPushMatrix(); glScalef(arm_x - 0.1, arm_y - 0.1, arm_z - 0.1); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glTranslatef(arm_x / 4, 0.0, 0.0); glPushMatrix(); glColor3f(0.5, 0.55, 0.55); glTranslatef(0.0, 0.0, -arm_z / 4); gluCylinder(quadratic, arm_y / 4, arm_y / 4, arm_z*0.5, 32, 32); glPopMatrix(); glRotatef(leftLowerHandAngle, 0.0, 0.0, 1.0); glTranslatef(arm_x / 4, 0.0, 0.0); glPushMatrix(); glScalef(arm_x - 0.1, arm_y - 0.1, arm_z - 0.1); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glPopMatrix(); glPushMatrix(); //画右手 glColor3f(0.5, 0.55, 0.55); glTranslatef(0, body_y / 2, 0.0); glRotatef(rightHigherHandAngle, 0.0, 0.0, 1.0); glTranslatef(arm_x / 4, 0.0, -(body_z + arm_z) / 4); glPushMatrix(); glScalef(arm_x, arm_y, arm_z); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glTranslatef(arm_x / 4, 0.0, 0.0); glPushMatrix(); glColor3f(0.5, 0.55, 0.55); glTranslatef(0.0, 0.0, -arm_z / 4); gluCylinder(quadratic, arm_y / 4, arm_y / 4, arm_z*0.5, 32, 32); glPopMatrix(); glRotatef(rightLowerHandAngle, 0.0, 0.0, 1.0); glTranslatef(arm_x / 4, 0.0, 0.0); glPushMatrix(); glScalef(arm_x - 0.1, arm_y - 0.1, arm_z - 0.1); glutSolidCube(GLOBAL_SIZE); glPopMatrix(); glPopMatrix(); glPopMatrix(); glFlush(); glutSwapBuffers(); } static double lookatx = -3.5, lookatz = -3.5, lookaty = 0; static int scrw, scrh; //实时刷新 void reshape(int w, int h) { scrw = w; scrh = h; glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 200.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(lookatx, lookaty, lookatz, centerX, 0, centerZ, 0.0, 1.0, 0.0); } //响应鼠标事件 void passiveMotionFunc(int x, int y) { lookatx = -5.0 + (double)x / scrw * 10.0; lookatz = sqrt(25 - lookatx * lookatx) + centerZ; lookatx += centerX; double tmpy = -5.0 + (double)y / scrh * 10.0; if (tmpy >= -GLOBAL_SIZE * leg_x * 2) lookaty = tmpy; glLoadIdentity(); glutPostRedisplay(); gluLookAt(lookatx, lookaty, lookatz, centerX, 0, centerZ, 0.0, 1.0, 0.0); } bool left = false; //规定当角度大于-75度时,小腿的角度变化,并比大腿变化快,规定是大腿地4倍 //响应键盘事件的,当按'w'时先前走,当按's'时为向后转 void keyboard(unsigned char key, int x, int y) { switch (key) { case 'w': for (int i = 0; i < speed; i++) { centerY = leg_x * sin(-leftHigherLegAngle / 180.0 * PI) - leg_x; // 为了简化计算,我粗略假定大腿每动1度,人会朝着其方向前进0.035个单位长度 double mvx = cos(angle / 180.0 * PI) * 0.035; // 计算x轴方向移动的距离 double mvz = sin(angle / 180.0 * PI) * 0.035; // 计算z轴方向移动的距离 if (!left) { //左脚迈出 leftHigherLegAngle--; rightHigherLegAngle++; if (leftHigherLegAngle >= -75) { LeftLowerLegAngle += 6; leftFootAngle = 0; } else if (leftHigherLegAngle < -105) LeftLowerLegAngle -= 6; if (leftHigherLegAngle == -120) { left = true; } leftHigherHandAngle++; leftLowerHandAngle++; rightHigherHandAngle--; rightLowerHandAngle--; } else { leftHigherLegAngle++; rightHigherLegAngle--; if (rightHigherLegAngle >= -75) { rightLowerLegAngle += 6; rightFootAngle = 0; } else if (rightHigherLegAngle < -105) rightLowerLegAngle -= 6; if (leftHigherLegAngle == -60) left = false; leftHigherHandAngle--; leftLowerHandAngle--; rightHigherHandAngle++; rightLowerHandAngle++; } centerX -= mvx; lookatx -= mvx; centerZ += mvz; lookatz += mvz; // 调整视角,始终把屏幕中心对准人的中心 glLoadIdentity(); gluLookAt(lookatx, lookaty, lookatz, centerX, 0, centerZ, 0.0, 1.0, 0.0); glutPostRedisplay(); } break; case 's': angle = (angle + 180) % 360; glutPostRedisplay(); break; case 'a': //左转 angle = (angle + 5) % 360; glutPostRedisplay(); break; case 'd': //右转 angle = (angle - 5) % 360; glutPostRedisplay(); break; case 'f': speed++; break; case 'h': if (speed > 0) speed--; break; } } //设置光照 void SetupLights() { GLfloat ambientLight[] = { 0.45f, 0.45f, 0.5f, 1.0f };//环境光 GLfloat diffuseLight[] = { 0.55f, 0.55f, 0.55f, 1.0f };//漫反射 GLfloat specularLight[] = { 0.6f, 0.6f, 0.6f, 1.0f };//镜面光 GLfloat lightPos[] = { 50.0f, 80.0f, 60.0f, 1.0f };//光源位置 glEnable(GL_LIGHTING); //启用光照 glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);//设置环境光源 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);//设置漫反射光源 glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); //设置镜面光源 glLightfv(GL_LIGHT0, GL_POSITION, lightPos);//设置灯光位置 glEnable(GL_LIGHT0);//打开第一个灯光 glEnable(GL_COLOR_MATERIAL);//启用材质的颜色跟踪 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面 glMaterialfv(GL_FRONT, GL_SPECULAR, specularLight); //指定材料对镜面光的反应 glMateriali(GL_FRONT, GL_SHININESS, 100); //指定反射系数 } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); LoadGLTexTures(g_texture, "body.bmp"); LoadGLTexTures_head(g_texture_head, "face.bmp"); LoadGLTexTures_ground(g_texture_ground, "ground.bmp"); LoadGLTexTures_sky(g_texture_sky, "sky.bmp"); glutDisplayFunc(display); glutReshapeFunc(reshape); //屏幕刷新是用 glutKeyboardFunc(keyboard);//按下按键 glutPassiveMotionFunc(passiveMotionFunc);//鼠标转动 SetupLights(); glutMainLoop(); return 0; }
实验截图
相关文章推荐
- Linux系统下通过nginx运行WordPress
- centos6.5 tomcat7日志切割
- bash脚本学习--批量增删用户
- logstash2.2.0过滤tomcat日志
- VirtualBox 配置 openwrtX86桥接外网开ssh开外网web
- strace在线上环境的troubleshooting
- docker+jenkins+git持续部署实践
- 利用TortoiseGit(小乌龟)将项目上传至GitHub网站
- org.apache.log4j.Logger详解
- linux gdb 调试 coredump core 文件,函数名称是 问号
- 关于“line 15: [: -gt: unary operator expected”报错的解决
- 自己学Docker:1.Docker安装--基于Ubuntu16.04
- windows下nginx安装、配置与使用
- Controller中错误 TypeError: $rootScope.$broadcast is not a function
- Linux权限设置
- 淘宝天猫网站停止支持IE6、IE7浏览器,你还在用xp吗?
- 淘宝天猫网站停止支持IE6、IE7浏览器,你还在用xp吗?
- ECSHOP手机访问和电脑访问效果一样
- elgg : A powerful open source social networking engine
- 使用System.arraycopy()实现数组之间的复制