在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例图形和图像处理 → opengl人物设计博士脸

opengl人物设计博士脸

图形和图像处理

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.02M
  • 下载次数:8
  • 浏览次数:132
  • 发布时间:2019-12-22
  • 实例类别:图形和图像处理
  • 发 布 人:duxz246
  • 文件格式:.cpp
  • 所需积分:2
 相关标签: OpenGL pe 设计

实例介绍

【实例简介】
【实例截图】
【核心代码】
#include<gl/glut.h>
#include<windows.h>
#include<math.h>
#include <stdio.h>
#include <stdlib.h>
#define GL_BGR_EXT 0x80E0
#define GL_BGRA_EXT 0x80E1
GLfloat light_position1[]={0,28,-20,1.0};
GLfloat model_ambient[]={0.05f,0.05f,0.05f,1.0f};
GLfloat mat_specular[]={0.8,1.0,1.0,1.0};
GLfloat mat_shininess[]={5.0};
GLfloat mat_ambient[]={0.1,0.1,0.1,1};
GLfloat white_light[]={1.0,1.0,1.0,1.0};
GLfloat light[]={1.0,1.0,1.0,1};
GLfloat light_position0[]={0,28,20,1.0};

GLint WinWidth;
GLint WinHeight;
//define the eyepoint
typedef struct EyePoint
{
 GLfloat x;
 GLfloat y;
 GLfloat z;
}EyePoint;
EyePoint myEye;
EyePoint vPoint;
GLfloat vAngle=0;

//the function about the texture
#define BMP_Header_Length 54
void grab(void) {
 FILE* pDummyFile; FILE* pWritingFile;
 GLubyte* pPixelData;
 GLubyte BMP_Header[BMP_Header_Length];
 GLint i, j;
 GLint PixelDataLength;
 i = WinWidth * 3;
 while( i%4 != 0 )
     i;
 PixelDataLength = i * WinHeight;
 pPixelData = (GLubyte*)malloc(PixelDataLength);
 if( pPixelData == 0 )
  exit(0);
 pDummyFile = fopen("dummy.bmp", "rb");
 if( pDummyFile == 0 )
  exit(0);
 pWritingFile = fopen("grab.bmp", "wb");
 if( pWritingFile == 0 )
  exit(0);
 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
 glReadPixels(0, 0, WinWidth, WinHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE, pPixelData);
 fread(BMP_Header, sizeof(BMP_Header), 1, pDummyFile);
 fwrite(BMP_Header, sizeof(BMP_Header), 1, pWritingFile);
 fseek(pWritingFile, 0x0012, SEEK_SET);
 i = WinWidth;
 j = WinHeight;
 fwrite(&i, sizeof(i), 1, pWritingFile);
 fwrite(&j, sizeof(j), 1, pWritingFile);
 fseek(pWritingFile, 0, SEEK_END);
 fwrite(pPixelData, PixelDataLength, 1, pWritingFile);
 fclose(pDummyFile); fclose(pWritingFile); free(pPixelData);
}
//power of two
int power_of_two(int n)
{
 if( n <= 0 )
 return 0;
 return (n & (n-1)) == 0;
}
/* 函数load_texture
 * 读取一个BMP文件作为纹理
 * 如果失败,返回0,如果成功,返回纹理编号
 */
//load texture function
GLuint load_texture(const char* file_name)
{
 GLint width, height, total_bytes;
 GLubyte* pixels = 0;
 GLint last_texture_ID=0;
 GLuint texture_ID = 0;
 //打开文件,如果失败,返回
 FILE* pFile = fopen(file_name, "rb");
 if( pFile == 0 )
  return 0;
 //读取文件中图像的宽度和高度
 fseek(pFile, 0x0012, SEEK_SET);
 fread(&width, 4, 1, pFile);
 fread(&height, 4, 1, pFile);
 fseek(pFile, BMP_Header_Length, SEEK_SET);
//计算每行像素所占字节数,并根据此数据计算总像素字节数
 {
  GLint line_bytes = width * 3;
  while( line_bytes % 4 != 0 )
    line_bytes;
  total_bytes = line_bytes * height;
 } //{
//根据总像素字节数分配内存
    pixels = (GLubyte*)malloc(total_bytes);
 if( pixels == 0 ){
  fclose(pFile);
 return 0;
 } //if
//读取像素数据
    if( fread(pixels, total_bytes, 1, pFile) <= 0 ){
  free(pixels);
  fclose(pFile);
 return 0;
 } //if
 /* 在旧版本的OpenGL中
  * 如果图像的宽度和高度不是整数次方,则需要进行缩放
  * 这里并没有检查OpenGL版本,出于对版本兼容性的考虑,按旧版本处理
  * 另外,无论旧版本还是新版本
  * 当图像的宽度和高度超过当前OpenGL实现所支持的最大值时,也要进行缩放
  */
 {
  GLint max;
  glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
  if( !power_of_two(width)|| !power_of_two(height)|| width > max|| height > max ){
   //规定缩放后新的大小为边长的正方形
   const GLint new_width = 256;
   const GLint new_height = 256;
   GLint new_line_bytes, new_total_bytes;
   GLubyte* new_pixels = 0;
    //计算每行需要的字节数和总字节数
   new_line_bytes = new_width * 3;
   while( new_line_bytes % 4 != 0 )
      new_line_bytes;
   new_total_bytes = new_line_bytes * new_height;
   //分配内存
   new_pixels = (GLubyte*)malloc(new_total_bytes);
   if( new_pixels == 0 ){
    free(pixels);
    fclose(pFile);
   return 0;
 }//if
   //进行像素缩放
 gluScaleImage(GL_RGB,width, height, GL_UNSIGNED_BYTE, pixels,new_width, new_height, GL_UNSIGNED_BYTE, new_pixels);
    //释放原来的像素数据,把pixels指向新的像素数据,并重新设置width和height
 free(pixels);
 pixels = new_pixels;
 width = new_width;
 height = new_height;
 }//if
}//{
//分配一个新的纹理编号
glGenTextures(1, &texture_ID);
 if( texture_ID == 0 ) {
  free(pixels);
  fclose(pFile);
 return 0;
} //if
   //绑定新的纹理,载入纹理并设置纹理参数
 //在绑定前,先获得原来绑定的纹理编号,以便在最后进程恢复
    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture_ID);
 //在分配了纹理对象编号后,使用glBingTexture函数来指定“当前所使用的纹理对象”
 glBindTexture(GL_TEXTURE_2D, texture_ID);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);
 glBindTexture(GL_TEXTURE_2D, last_texture_ID);
 //之前为pixels分配的内存可在使用glTexImage2D以后释放
 //因为此时像素数据已经被OpenGL另行保存了一份(可能被保存到专门的图形硬件中)
 free(pixels);
 return texture_ID;
}
//set the names of the texture objects 定义纹理对象的名称
GLuint texblackboard,texwindow,texwindow1,texceiling,
       texdoor,texbackwall,texgaodi,textdesk,textwall,textfloor,textdesk1;
//draw the scene of the classroom
void drawscence()
{

 //draw the ceiling
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texceiling);
 glColor3f(0.3,0.3,0.3);
 glBegin(GL_QUADS);
 glNormal3f(0.0f, -1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);
 glVertex3f(-40.0f,30.0f, 30.0f);
 glTexCoord2f(0.0f, 3.0f);
 glVertex3f(-40.0f, 30.0f, -30.0f);
 glTexCoord2f(6.0f, 3.0f);
 glVertex3f(40.0f, 30.0f, -30.0f);
 glTexCoord2f(6.0f, 0.0f);
 glVertex3f(40.0f, 30.0f, 30.0f);
 glEnd();
 glDisable(GL_TEXTURE_2D);

 //draw the floor
    glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, textfloor);
 glColor3f(1.0f, 1.0f, 1.0f);
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glVertex3f(-40.0f,0.0f, 30.0f);
    glVertex3f(-40.0f, 0.0f, -30.0f);
 glVertex3f(40.0f, 0.0f, -30.0f);
    glVertex3f(40.0f, 0.0f, 30.0f);
    glEnd();
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, textwall);
 //the wall and the windows in left
 glColor3f(0.8f,0.8f, 0.8f);
 glBegin(GL_QUADS);
 glNormal3f(1.0f, 0.0f, 0.0f);
 glVertex3f(-40.0f,0.0f, 30.0f);
 glVertex3f(-40.0f, 30.0f, 30.0f);
 glVertex3f(-40.0f, 30.0f, -30.0f);
 glVertex3f(-40.0f, 0.0f, -30.0f);
 glEnd();
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texwindow);
    for(int n=0;n<=1;n  )
 {
  glBegin(GL_QUADS);
  glNormal3f(1.0, 0.0f, 0.0f);
  glTexCoord2f(1.0f, 0.0f);glVertex3f(-39.9, 10, -8 n*18);
  glTexCoord2f(1.0f, 1.0f);glVertex3f(-39.9, 20, -8 n*18);
  glTexCoord2f(0.0f, 1.0f);glVertex3f(-39.9, 20, -18 n*18);
  glTexCoord2f(0.0f, 0.0f);glVertex3f(-39.9, 10, -18 n*18);
  glEnd();
 }
 glDisable(GL_TEXTURE_2D);
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, textwall);
 //the wall and the window in right
 glColor3f(0.8f,0.8f, 0.8f);
 glBegin(GL_QUADS);
 glNormal3f(-1.0f, 0.0f, 0.0f);
 glVertex3f(40.0f,0.0f, 30.0f);
 glVertex3f(40.0f, 30.0f, 30.0f);
 glVertex3f(40.0f, 30.0f, -30.0f);
 glVertex3f(40.0f, 0.0f, -30.0f);
 glEnd();
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texwindow1);
 glBegin(GL_QUADS);
 glNormal3f(-1.0, 0.0f, 0.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(39.5, 10, 10);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(39.5, 20, 10);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(39.5, 20, 0);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(39.5, 10, 0);
 glEnd();
 glDisable(GL_TEXTURE_2D);
 //backwall
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texbackwall);
 glColor3f(0.8f,0.8f, 0.8f);
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 0.0f, 1.0f);
 glTexCoord2f(0.0f, 0.0f);
 glVertex3f(-40.0f,0.0f, 30.0f);
 glTexCoord2f(0.0f, 1.0f);
 glVertex3f(-40.0f, 30.0f, 30.0f);
 glTexCoord2f(1.0f, 1.0f);
 glVertex3f(40.0f, 30.0f, 30.0f);
 glTexCoord2f(1.0f, 0.0f);
 glVertex3f(40.0f, 0.0f, 30.0f);
 glEnd();
 //frontwall
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texbackwall);
 glColor3f(0.8f,0.8f, 0.8f);
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 0.0f, 1.0f);
 glTexCoord2f(0.0f, 0.0f);
 glVertex3f(-40.0f,0.0f, -30.0f);
 glTexCoord2f(0.0f, 1.0f);
 glVertex3f(-40.0f, 30.0f, -30.0f);
 glTexCoord2f(1.0f, 1.0f);
 glVertex3f(40.0f, 30.0f, -30.0f);
 glTexCoord2f(1.0f, 0.0f);
 glVertex3f(40.0f, 0.0f, -30.0f);
 glEnd();
 //blackboard
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texblackboard);
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 0.0f, 1.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(-20.0,8.0f, -29.9f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(-20.0, 18.0f, -29.9f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(20.0, 18.0f, -29.9f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(20.0, 8.0f, -29.9f);
 glEnd();
 glDisable(GL_TEXTURE_2D);
 //gaodi
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texgaodi);
 //top
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(-30.0f, 1.5f, -22.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(-30.0f, 1.5f, -30.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(30.0f, 1.5f, -30.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(30.0f, 1.5f, -22.0f);
 glEnd();
 //down
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 0.0f, 1.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(-30.0f, 0, -22.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(-30.0f, 1.5f, -22.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(-30.0f, 1.5f, -30.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(-30.0f, 0, -30.0f);
 glEnd();
 //front
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(-30.0f, 0, -22.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(-30.0f, 1.5f, -22.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(30.0f, 1.5f, -22.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(30.0f, 0, -22.0f);
 glEnd();
 //back
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(30.0f, 0, -22.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(30.0f, 1.5f, -22.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(30.0f, 1.5f, -30.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(30.0f, 0, -30.0f);
 glEnd();
 glDisable(GL_TEXTURE_2D);
    //jiangtai
 glBindTexture(GL_TEXTURE_2D, textdesk);
 glEnable(GL_TEXTURE_2D);
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(-7.5f, 1.5f, -24.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(-7.5f, 9.5f, -24.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(7.5f, 9.5f, -24.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(7.5f, 1.5f, -24.0f);
 glEnd();
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(7.5f, 1.5f, -24.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(7.5f, 9.5f, -24.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(7.5f, 9.5f, -28.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(7.5f, 1.5f, -28.0f);
 glEnd();
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(-7.5f, 1.5f, -24.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(-7.5f, 9.5f, -24.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(-7.5f, 9.5f, -28.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(-7.5f, 1.5f, -28.0f);
 glEnd();
 glBegin(GL_QUADS);
 glNormal3f(0.0f, 1.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(-7.5f, 9.5f, -24.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(-7.5f, 9.5f, -26.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(7.5f, 9.5f, -26.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(7.5f, 9.5f, -24.0f);
 glEnd();
    //door
 glColor3f(0.521f,0.121f,0.0547f);
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, texdoor);
 glBegin(GL_QUADS);
 glNormal3f(-1.0f, 0.0f, 0.0f);
 glTexCoord2f(0.0f, 0.0f);glVertex3f(39.9f, 0.0f, -25.0f);
 glTexCoord2f(0.0f, 1.0f);glVertex3f(39.9f, 14.0f, -25.0f);
 glTexCoord2f(1.0f, 1.0f);glVertex3f(39.9f, 14.0f, -19.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(39.9f, 0.0f, -19.0f);
 glEnd();
 glDisable(GL_TEXTURE_2D);
}
 //draw the desks
 void drawdesks()
{
 GLfloat desk[]={1,0.9647,0.56078};
 for(int y=0;y<=2;y  ) {
  for(int x=0;x<=1;x  ) {
  //top
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textdesk1);
  glColor4f(1,0.9647,0.56078,1);
  glPushMatrix();
  glTranslatef(-20.0 x*40,8.1,-17.5 y*8);
  glScalef(10,0.2,3);
  glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,desk);
  glutSolidCube(1.0f);
  glPopMatrix();
  glDisable(GL_TEXTURE_2D);
  //down
  glColor4f(1,0.9647,0.56078,1);
  glPushMatrix();
  glTranslatef(-20.0 x*40,6.1,-17.5 y*8);
  glScalef(9,0.2,3);
  glutSolidCube(1.0f);
  glPopMatrix();
  //front
  glColor4f(1,0.9647,0.56078,1);
  glPushMatrix();
  glTranslatef(-20.0 x*40,7,-18.9 y*8);
  glScalef(10,2,0.2);
  glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,desk);
  glutSolidCube(1.0f);
  glPopMatrix();

  //leg
  glColor3f(0.0,0.0,0.0);
  glBegin(GL_LINES);
  glLineWidth(3.0f);
  glVertex3f(-25.0 x*40,6.0f, -19 y*8);
  glVertex3f(-25.0 x*40,0.0f, -19 y*8);
  glEnd();
  glBegin(GL_LINES);
  glLineWidth(3.0f);
  glVertex3f(-15.0 x*40,6.0f, -19 y*8);
  glVertex3f(-15.0 x*40,0.0f, -19 y*8);
  glEnd();
  glBegin(GL_LINES);
  glLineWidth(3.0f);
  glVertex3f(-25.0 x*40,0.0f, -18 y*8);
  glVertex3f(-25.0 x*40,0.0f, -20 y*8);
  glEnd();
  glBegin(GL_LINES);
  glLineWidth(3.0f);
  glVertex3f(-15.0 x*40,0.0f, -18 y*8);
  glVertex3f(-15.0 x*40,0.0f, -20 y*8);
  glEnd();
} //for
  //the desks in the middle
  //top
  glEnable(GL_TEXTURE_2D);
     glBindTexture(GL_TEXTURE_2D, textdesk1);
  glColor3f(1,0.9647,0.56078);
  glPushMatrix();
  glTranslatef(0,8.1,-17.5 y*8);
  glScalef(20,0.2,3);
  glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,desk);
  glutSolidCube(1.0f);
  glPopMatrix();
  glDisable(GL_TEXTURE_2D);
  //down
  glColor3f(1,0.9647,0.56078);
  glPushMatrix();
  glTranslatef(0,6.1,-17.5 y*8);
  glScalef(19,0.2,3);
  glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,desk);
  glutSolidCube(1.0f);
  glPopMatrix();
  //front
  glColor3f(1,0.9647,0.56078);
  glPushMatrix();
  glTranslatef(0,7,-18.9 y*8);
  glScalef(20,2,0.2);
  glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,desk);
  glutSolidCube(1.0f);
  glPopMatrix();
  //leg
  glColor3f(0.0,0.0,0.0);
  glBegin(GL_LINES);
  glLineWidth(5.0f);
  glVertex3f(-10.0,6.0f, -19 y*8);
  glVertex3f(-10.0,0.0f, -19 y*8);
  glEnd();
  glBegin(GL_LINES);
  glLineWidth(5.0f);
  glVertex3f(10.0,6.0f, -19 y*8);
  glVertex3f(10.0,0.0f, -19 y*8);
  glEnd();
  glBegin(GL_LINES);
  glLineWidth(5.0f);
  glVertex3f(-10.0,0.0f, -18 y*8);
  glVertex3f(-10,0.0f, -20 y*8);
  glEnd();
  glBegin(GL_LINES);
  glLineWidth(5.0f);
  glVertex3f(10,0.0f, -18 y*8);
  glVertex3f(10,0.0f, -20 y*8);
  glEnd();
}//for
}
//drawchairs
void drawchairs()
{
 GLfloat chair[]={0.1,0.67,0.62};
 for(int j=0;j<=2;j  ){
  for(int i=0;i<=1;i  ){
 //down
 glColor3f(0.1,0.67,0.62);
 glPushMatrix();
 glTranslatef(-20 i*40,3.1,-14.5 j*8);
 glScalef(10,0.2,3);
 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,chair);
 glutSolidCube(1.0f);
 glPopMatrix();
 //back
 glColor3f(0.1,0.67,0.62);
 glPushMatrix();
 glTranslatef(-20 i*40,5,-13 j*8);
 glScalef(10,4,0.2);
 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,chair);
 glutSolidCube(1.0f);
 glPopMatrix();
 //leg
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
 glLineWidth(3.0f);
 glVertex3f(-25 i*40,3.0f, -13 j*8);
 glVertex3f(-25 i*40,0.0f, -13 j*8);
 glEnd();
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
 glLineWidth(3.0f);
 glVertex3f(-15.0 i*40,3.0f, -13 j*8);
 glVertex3f(-15.0 i*40,0.0f, -13 j*8);
 glEnd();
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
    glLineWidth(3.0f);
 glVertex3f(-25.0 i*40,0.0f, -12.5 j*8);
 glVertex3f(-25 i*40,0.0f, -13.5 j*8);
 glEnd();
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
 glLineWidth(3.0f);
 glVertex3f(-15 i*40,0.0f, -12.5 j*8);
 glVertex3f(-15 i*40,0.0f, -13.5 j*8);
 glEnd();
 }
 //down
 glColor3f(0.1,0.67,0.62);
 glPushMatrix();
 glTranslatef(0,3.1,-14.5 j*8);
 glScalef(20,0.2,3);
 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,chair);
 glutSolidCube(1.0f);
 glPopMatrix();
 //back
 glColor3f(0.1,0.67,0.62);
 glPushMatrix();
 glTranslatef(0,5,-13 j*8);
 glScalef(20,4,0.2);
 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,chair);
 glutSolidCube(1.0f);
 glPopMatrix();
 //leg
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
 glLineWidth(3.0f);
 glVertex3f(-10,3.0f, -13 j*8);
 glVertex3f(-10,0.0f, -13 j*8);
 glEnd();
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
 glLineWidth(3.0f);
 glVertex3f(10,3.0f, -13 j*8);
 glVertex3f(10,0.0f, -13 j*8);
 glEnd();
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
 glLineWidth(3.0f);
 glVertex3f(-10,0.0f, -12.5 j*8);
 glVertex3f(-10,0.0f, -13.5 j*8);
 glEnd();
 glColor3f(0.0,0.0,0.0);
 glBegin(GL_LINES);
 glLineWidth(3.0f);
 glVertex3f(10,0.0f, -12.5 j*8);
 glVertex3f(10,0.0f, -13.5 j*8);
 glEnd();
}
}
//reshape
void reshape(int we,int he)
{
 WinWidth=we;
 WinHeight=he;
 glViewport(0,0,(GLsizei) we, (GLsizei) he);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(90.0f, (GLfloat)we/(GLfloat)he, 0.01f,100.0f);
 //透视图,参数1.眼睛睁开的角度 2.实际窗口的纵横比,即x/y
 //    3.近处的裁面   4.远处的裁面
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt(myEye.x, myEye.y, myEye.z, vPoint.x 30*sin(vAngle), vPoint.y,-30*cos(vAngle), 0.0f, 1.0f, 0.0f);
}
void display()
{
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 //the function of drawing
 drawscence();
 //drawprojector();
 drawdesks();
 drawchairs();
 glFlush();
}
//the action of the keyboard
GLvoid OnKeyboard(unsigned char key, int x, int y)
{
 switch(key){
  //left
  case 97:
      myEye.x-=0.5;
   vPoint.x-=0.5;
      if(myEye.x<=-40)
   myEye.x=-40;
   break;
  //right
  case 100:
   myEye.x =0.5;
   vPoint.x =0.5;
   if(myEye.x>=40)
   myEye.x=40;
   break;
     //down
  case 119:
   myEye.z-=0.5;
   if(myEye.z<=-30)
   myEye.z=-30;
  break;
  //up
  case 115:
   myEye.z =0.5;
   if(myEye.z>=30)
   myEye.z=30;
  break;
  case 27:
  exit(0);
 }
 reshape(WinWidth,WinHeight);
 glutPostRedisplay();
}
// the action of the special
GLvoid OnSpecial(int key, int x, int y)
{
  switch(key){
      case GLUT_KEY_LEFT:
   vAngle-=0.05;
   break;
   case GLUT_KEY_RIGHT:
   vAngle =0.05;
   break;
   case GLUT_KEY_UP:
   myEye.y =0.05;
            if(myEye.y>=30)
   myEye.y=30;
   break;
   case GLUT_KEY_DOWN:
   myEye.y-=0.5;
   if(myEye.y<=0)
   myEye.y=30;
   break;
   case GLUT_KEY_PAGE_DOWN:
   myEye.z =0.5;
   if(myEye.z>=30)
   myEye.z=30;
   break;
   case GLUT_KEY_PAGE_UP:
   myEye.z-=0.5;
   if(myEye.z<=-30)
   myEye.z=-30;
   break;
 }
 reshape(WinWidth,WinHeight);
 glutPostRedisplay();
}
//idle function
GLvoid OnIdle()
{
 glutPostRedisplay();
 //标记当前窗体来重新显示,它会促使主循环尽快的调用完显示函数
}
//initial function,initial many parameters including the light and so on
void initial(){
 glClearColor(0,0,0,0);
 glEnable(GL_TEXTURE_2D);
 glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);//set the mode of the current texture mapping

 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient);
 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);
 glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
 glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
 glLightfv(GL_LIGHT0,GL_POSITION,light_position0);
 glLightfv(GL_LIGHT0,GL_AMBIENT,mat_ambient);
 glLightfv(GL_LIGHT0,GL_DIFFUSE,light);
 glLightfv(GL_LIGHT0,GL_SPECULAR,light);
 glLightfv(GL_LIGHT1,GL_POSITION,light_position1);
 glLightfv(GL_LIGHT1,GL_AMBIENT,mat_ambient);
 glLightfv(GL_LIGHT1,GL_DIFFUSE,white_light);
 glLightfv(GL_LIGHT1,GL_SPECULAR,white_light);
 glEnable(GL_LIGHTING);
 glEnable(GL_LIGHT0);
 glEnable(GL_COLOR_MATERIAL);
    glShadeModel(GL_SMOOTH); //set the mode of the color(flat or smooth)
 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
 glEnable(GL_DEPTH_TEST);
}

int main(int argc, char* argv[])
{
 myEye.x=0;
 myEye.y=15;
 myEye.z=25;
 vPoint.x=0;
 vPoint.y=15;
 vPoint.z=-30;
 vAngle=0;
 glEnable(GL_DEPTH_TEST);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
 glutInitWindowPosition(400, 0);
 glutInitWindowSize(800, 600);
 glutCreateWindow("教室");
 initial();
 glutDisplayFunc(&display);
 glutReshapeFunc(reshape);
 glutKeyboardFunc(OnKeyboard);
 glutSpecialFunc(OnSpecial);
 glutIdleFunc(OnIdle);

    /* set the texture */
 texblackboard=load_texture("blackboard.bmp");
 texwindow=load_texture("window.bmp");
 texwindow1=load_texture("window1.bmp");
    texgaodi=load_texture("gaodi.bmp");
 texceiling=load_texture("ceiling.bmp");
 texdoor=load_texture("door.bmp");
    texbackwall=load_texture("backwall.bmp");
    textdesk=load_texture("tdesk.bmp");
 textwall=load_texture("wall.bmp");
 textfloor=load_texture("floor.bmp");
 textdesk1=load_texture("desk.bmp");

 glutMainLoop();
    return 0;
}

标签: OpenGL pe 设计

实例下载地址

opengl人物设计博士脸

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警