C++ VS OpenGL绘制教室三维立体旋转图像

如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助!

运行结果如下:

步骤:

第一步:安装VS2019

第二步:VS2019安装OpenGL

第三步:新建项目

第四步:导入代码文件

第五步:运行

主要代码:

#include<windows.h>
#include<math.h>
#include<time.h>
#pragma warning(disable:4996)
/*******************************定义程序中所用的常数变量******************************************/
GLfloat light_position1[] = { 0,28,0,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 };GLUquadricObj* qobj;
int           fantheta = 0;
BOOL          TurnOn = FALSE;// 当前时间,时 分 秒
float h = 0.0f;
float m = 0.0f;
float s = 0.0f;
const GLfloat PI = 3.141592653f;
/************************定义视点结构*********************************************************/
typedef struct EyePoint
{GLfloat    x;GLfloat y;GLfloat z;
}EyePoint;
EyePoint    myEye;
EyePoint    vPoint;
EyePoint    up;
GLfloat pro_up_down = 29.0f;
GLfloat vAngle = 0;
/****************************载入位图作为纹理的相关函数************************************/
#define BMP_Header_Length 54int power_of_two(int n)
{if (n <= 0)return 0;return (n & (n - 1)) == 0;
}
/****************************载入一副位图作为纹理,返回的是纹理编号**********************************************/
GLuint load_texture(const char* file_name)
{// 读取文件中图象的宽度和高度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 (fread(pixels, total_bytes, 1, pFile) <= 0)GLint max;glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);//获得OpenGL所支持的最大纹理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;}// 进行像素缩放gluScaleImage(GL_RGB, width, height, GL_UNSIGNED_BYTE, pixels, new_width, new_height, GL_UNSIGNED_BYTE, new_pixels);// 释放原来的像素数据,把 pixels 指向新的像素数据,并重新设置 width 和 heightfree(pixels);pixels = new_pixels;width = new_width;height = new_height;}}
/**********************************定义各个纹理对象的名称************************************/
GLuint texblackboard, texwindow, texdesk, texsound;
GLuint texceiling, texdoor, texfloor, texbackwall, texpole;
GLuint texairfro, texairback, texhighland, texsdesk, texclock;
/*******************************绘制相关函数**************************************************///绘制教室这个大场景
void drawscence()
{//设置材质相关参数/*指定材质对漫射光的反射率,第一个参数决定该材质运用于图元的正面还是反面第二个参数表示对何种光进行设置,GL_AMBIENT(环境光)、GL_DIFFUSE(漫射光)、GL_AMBIENT_AND_DIFFUSE(环境光和漫射光)、GL_SPECULAR(平行/镜面光,第三个参数是一个四维数组,这个数组描述了反光率的RGBA值,每一项取值都为0-1之间*/glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);//首先绘制天花板glEnable(GL_TEXTURE_2D);//开启2D纹理功能glBindTexture(GL_TEXTURE_2D, texceiling);//绑定纹理//glColor3f(0.3, 0.3, 0.3);//设置颜色,黑色//glColor3f(255, 255, 255);glBegin(GL_QUADS);//画四边形glNormal3f(0.0f, -1.0f, 0.0f);//用于定义法线向量/*glTexCoord2f绘制图形时指定纹理的坐标,第一个是X轴坐标,0.0是纹理的左侧,0.5是纹理的中点,1.0是纹理的右侧,第二个是Y轴坐标,0.0是纹理的底部,0.5是纹理的中点,1.0是纹理的顶部,为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角,纹理的左上坐标是X:0.0,Y:1.0f,四边形的左上顶点是X:-1.0,Y:1.0。*/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);//................................风扇................................................//GLuint m = 0;qobj = gluNewQuadric();//初始化二次曲面并创建一个指向二次曲面的指针 //...............................右边的风扇.............................//glPushMatrix();//压入堆栈,保证此处坐标变换不影响外部大环境 glTranslatef(20.0, 5.0, -10.0 - 40 * m);  //风扇的位置if (TurnOn == TRUE)  //如果TurnOn为1{fantheta += 10;  //风扇转过的角度fantheta不断增加}glRotatef(fantheta, 0, 1, 0);        //风扇旋转glPushMatrix();//压入堆栈glColor3f(0.7, 0.7, 0.7);glTranslatef(0, 20, 0.0);//平移变换glScalef(1, 0.05, 1);//缩放变换glRotatef(240, 0, 1, 0);//绕y周旋转240度   gluCylinder(qobj, 1, 3, 10, 20, 20);//绘制一个底面圆半径为1、顶面圆半径为2、高为10的圆锥体glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, light_Diffuse);//定义材质光照glPopMatrix();//弹出堆栈
//.............风扇的杆...........................//glPushMatrix();//压入堆栈glTranslatef(0, 33, 0.0);//平移变换glRotatef(90, 1, 0, 0);//缩放变换gluCylinder(qobj, 0.5, 0.5, 13, 10, 10);//绘制一个半径为0.5、高为13的圆锥体glPopMatrix();//弹出堆栈glPopMatrix();//弹出堆栈//................左边的风扇...........................................//glPushMatrix();glTranslatef(-20.0, 5.0, -10.0 - 40 * m);if (TurnOn == TRUE){fantheta += 10;}glRotatef(fantheta, 0, 1, 0);//..........风扇中间的扁圆形....................//glPushMatrix();//风扇中间的扁圆形glColor3f(0.7, 0.7, 0.7);glTranslatef(0.0, 20.0, 0.0);glScalef(1, 0.3, 1);gluSphere(qobj, 2, 20, 20);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, light_Diffuse);glPopMatrix();//............风扇旋转120度的扇叶...............//      glPushMatrix();//风扇旋转120度的扇叶glColor3f(0.7, 0.7, 0.7);glTranslatef(0, 20, 0.0);glScalef(1, 0.05, 1);glRotatef(120, 0, 1, 0);gluCylinder(qobj, 1, 3, 10, 20, 20);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, light_Diffuse);glPopMatrix();//............风扇不做旋转的扇叶.................//glPushMatrix();//风扇不做旋转的扇叶glColor3f(0.7, 0.7, 0.7);glTranslatef(0, 20, 0.0);glScalef(1, 0.05, 1);gluCylinder(qobj, 1, 3, 10, 20, 20);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, light_Diffuse);glPopMatrix();//.............风扇旋转240度的扇叶...............//glPushMatrix();//风扇旋转240度的扇叶glColor3f(0.7, 0.7, 0.7);glTranslatef(0, 20, 0.0);glScalef(1, 0.05, 1);glRotatef(240, 0, 1, 0);gluCylinder(qobj, 1, 3, 10, 20, 20);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, light_Diffuse);glPopMatrix();//.............风扇的杆...........................//glPushMatrix();glTranslatef(0, 33, 0.0);glRotatef(90, 1, 0, 0);gluCylinder(qobj, 0.5, 0.5, 13, 10, 10);glPopMatrix();glPopMatrix();//绘制黑板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);//画黑板上方的灯GLfloat blacklight[] = { 0.9,0.9,0.9,1 };//颜色(R,G,B,A),A仅用于颜色混合函数激活之后glColor3f(1.0f, 1.0f, 1.0f);//glColor3f(255, 255, 255);glPushMatrix();//把当前的模型视图矩阵压入堆栈中保存下来glTranslatef(-15, 20.4, -29.5);//平移函数,参数含义:位移glScalef(8.0f, 0.8, 1.0f);//缩放函数,参数含义:倍数glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blacklight);glutSolidCube(1.0f);//绘制边长为1的实心立方体,立方体的中心位于原点glPopMatrix();glPushMatrix();glTranslatef(12, 20.4, -29.5);glScalef(8.0f, 0.8, 1.0f);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blacklight);glutSolidCube(1.0f);glPopMatrix();//绘制教室前边一块高地并贴纹理glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texhighland);//贴上面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();//贴左边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();//贴前边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();//glColor3f(255, 255, 255);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);//绘制音响glColor3f(0.0f, 0.0f, 0.0f);//glColor3f(255, 255, 255);glPushMatrix();glTranslatef(-37.5, 26.25f, -5.5f);glScalef(1.0f, 1.5f, 1.0f);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sound);glutSolidCube(1.0f);glPopMatrix();glPushMatrix();glTranslatef(37.5, 26.25f, -5.5f);glScalef(1.0f, 1.5f, 1.0f);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sound);glutSolidCube(1.0f);glPopMatrix();}
/**************************************绘制投影仪***********************************************/
void drawprojector()
{glColor3f(1.0f, 1.0f, 1.0f);glBegin(GL_QUADS);glNormal3f(1.0f, 0.0f, 1.0f); //用于定义法线向量glVertex3f(-40.0f, 30.0f, -30.0 + 10 * sqrt(2));glVertex3f(-40.0 + 10 * sqrt(2), 30.0f, -30.0f);//固定的两个点glVertex3f(-40.0 + 10 * sqrt(2), pro_up_down, -30.0f);glVertex3f(-40.0f, pro_up_down, -30.0 + 10 * sqrt(2));//下降或升起时改变的点glEnd();glColor3f(0.0f, 0.0f, 0.0f);glLineWidth(4.0f);glBegin(GL_LINES);glVertex3f(-25.0f, 30.0f, -15.0f);glVertex3f(-25.0f, 25.0f, -15.0f);glEnd();glColor3f(0.5f, 0.5f, 0.5f);glPushMatrix();glTranslatef(-25.0f, 24.0f, -15.0f);glScalef(4.0f, 2.0f, 2.0f);glutSolidCube(1.0f);glPopMatrix();glColor3f(0.0, 0.0, 0.0);glBegin(GL_LINE_LOOP);//给出的点会绘制为一个环(所有的点首尾相接)glVertex3f(-40.0f, 30.0f, -30.0 + 10 * sqrt(2));glVertex3f(-40.0 + 10 * sqrt(2), 30.0f, -30.0f);}
}
//绘制椅子
void drawchairs()
{GLfloat chair[] = { 1.0f, 1.0f, 0.45f, 1.0f };// { 0.1, 0.67, 0.62 };for (int j = 0; j <= 4; j++){for (int i = 0; i <= 1; i++){//画椅子底部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();//画椅子靠背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();//画椅子腿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();/*******************************************响应普通键盘操作,w,s,a,d以及退出esc键*******************************/
GLvoid OnKeyboard(unsigned char key, int x, int y)
{switch (key){case 97://a 向左myEye.x -= 0.5;vPoint.x -= 0.5;if (myEye.x <= -38)myEye.x = -38;break;case 100://d 向右myEye.x += 0.5;vPoint.x += 0.5;if (myEye.x >= 38)myEye.x = 38;break;case 119://w 向前myEye.z -= 0.5;if (myEye.z <= -28)myEye.z = -28;break;case 115://s 向后myEye.z += 0.5;if (myEye.z >= 28)myEye.z = 28;break;case 27://escexit(0);}reshape(WinWidth, WinHeight);//窗口刷新glutPostRedisplay();}
/****************************************响应特殊键盘操作******************************************************/
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://PageDown键myEye.z += 0.5;if (myEye.z >= 30)myEye.z = 30;break;case GLUT_KEY_PAGE_UP://PageUp键myEye.z -= 0.5;if (myEye.z <= -30)myEye.z = -30;break;case GLUT_KEY_F1:projectup();break;case GLUT_KEY_F2:projectdown();break;case GLUT_KEY_F3:glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);glEnable(GL_LIGHT1);break;case GLUT_KEY_F4://glDisable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);glDisable(GL_LIGHT1);break;case GLUT_KEY_F5:TurnOn = true;break;case GLUT_KEY_F6:TurnOn = false;break;}reshape(WinWidth, WinHeight);glutPostRedisplay();
}
GLvoid OnIdle()
{glutPostRedisplay();// 重画//当回调函数处理完键盘事件后,显示函数会自动被调用,屏幕会被重绘.这样,GLUT程序会过于频繁的调用显示函数,抢占cpu资源//选择性的告诉GLUT去调用显示函数(glutPostRedisplay函数会标记当前窗体来重新显示)//目的:节省cpu资源,保持我们的GLUT程序的占用行为不生效.
}
/*************************************初始化函数,对各项参数进行初始化*********************************************/
void initial()
{glClearColor(0, 0, 0, 0);glEnable(GL_TEXTURE_2D);/*设置纹理跟材质的融合方式,这里是只是用纹理,覆盖模型的材质*/glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);/*********************************************对灯光进行初始化****************************************************/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);//指定物体前面镜面反射的指数/*设置点光源*//*GL_POSITION指定光源位置,GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色),对背景(环境)光有贡献。GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)。GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)。通常,GL_AMBIENT和GL_DIFFUSE都取相同的值,可以达到比较真实的效果。使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENT和GL_DIFFUSE属性。*//*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_LIGHT1);glEnable(GL_COLOR_MATERIAL);//激活/**********************************************************************************************//*glShadeModel函数用于控制opengl中绘制指定两点间其他点颜色的过渡模式,GL_SMOOTH(默认)将制定的两点颜色进行插值,绘制之间的其他点*/glShadeModel(GL_SMOOTH);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);  //指定材料着色的面//glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);  //指定材料对镜面光的反射glEnable(GL_DEPTH_TEST);//
}
void print()
{printf("**************************************************** \n");printf(" \n");printf("操作按键信息提示: \n");printf("上键和下键分别控制视角向下和向上 \n");printf("左键和右键分别控制向左环视和向右环视 \n");printf("w,s,a,d键分别表示向前,后,左,右,进行平移(注意键盘大小写)\n");printf("pgup和pgdn分别控制向前漫游和向后漫游 \n");printf("F5、F6键分别控制风扇的开、关 \n");printf("F3、F4键分别控制开灯、关灯 \n");printf("F1、F2键分别控制投影仪放下和收起 \n");printf("ESC键退出窗口 \n");printf(" \n");}
int main(int argc, char* argv[])
{myEye.x = 0;myEye.y = 15;myEye.z = 25;vPoint.x = 0;vPoint.y = 15;vPoint.z = -30;up.x = 0;up.y = 1;up.z = 0;vAngle = 0;/*启用了之后,OpenGL在绘制的时候就会检查,当前像素前面是否有别的像素,如果别的像素挡道了它,那它就不会绘制,也就是说,OpenGL就只绘制最前面的一层。*/glEnable(GL_DEPTH_TEST);glutInit(&argc, argv);/*定义显示方式,GLUT_RGBA指定一个RGBA窗口,GLUT_SINGLE.单缓冲区窗口*/glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);glutInitWindowPosition(400, 0);//设置初始窗口的位置(窗口左上角相对于桌面坐标(x,y))glutInitWindowSize(800, 600);//设置窗口大小glutCreateWindow("classroom");initial();//创建显示窗口SetupRC();//(2)glutDisplayFunc(&myDisplay);glutTimerFunc(1000, timerFunc, 1);//(1)//glutDisplayFunc(&myDisplay);//注册显示回调函数,包含重绘场景所需的所有代码glutReshapeFunc(reshape);//注册窗口改变回调函数glutKeyboardFunc(OnKeyboard);//注册键盘响应事件//对键盘上特殊的4个方向按键的响应函数glutSpecialFunc(OnSpecial);glutIdleFunc(OnIdle);//注册闲置响应函数,该函数调用放在主程序main()中,通常利用它可实现简单动画。///***************************************设置纹理***********************************************/texblackboard = load_texture("blackboard.bmp");texwindow = load_texture("window.bmp");texsound = load_texture("sound.bmp");texceiling = load_texture("ceiling.bmp");texdoor = load_texture("door.bmp");texfloor = load_texture("floor.bmp");texbackwall = load_texture("backwall.bmp");texpole = load_texture("pole.bmp");texairfro = load_texture("airconditionfront.bmp");texairback = load_texture("airconditionback.bmp");texhighland = load_texture("gaodi.bmp");texsdesk = load_texture("sdesk.bmp");texclock = load_texture("clock.bmp");///************************************************************************************************/print();//开始显示glutMainLoop();//进入事件处理循环return 0;
}

运行结果如下:

C++ VS OpenGL绘制教室三维立体旋转图像相关推荐

  1. Matlab 三维相图,用MATLAB绘制Pb-Sn-Sb三维立体相图

    第41卷 第8期 稀 有 金 CHINESE J0URNAL OF RARE METALS 2017年 8月 Aug.2017 用 MATLAB绘制 Pb-Sn-Sb三维立体 相 图 周 亮 ,孔令鑫 ...

  2. autoCAD绘制简单三维立体图形

    第一步: 首先绘制一个简单的(封闭的)二维图形: 第二步: 变换观察视角,比如修改为 变换后的视角: 第三步: 选中闭合图形边框,使用组合键"ctrl + shift + E",然 ...

  3. matlab画图三维立体,matlab的三维图形绘制

    1 基本命令 plot3(x,y,z,'s')      %绘制三维曲线 plot3(x1,y1,z1,'s1',x2,y2,z2,'s2',...)   %绘制多条三维曲线 说明:当xyz为同维向量 ...

  4. HTML绘制齿轮,如何用CAD绘制三维立体齿轮??

    CAD常常应用于机械制图中,那么绘制齿轮这类的零件自然是必不可少的,今天我们就来讲解下怎么用CAD绘制三维立体的齿轮吧! 1.打开CAD软件,利用左侧的直线工具绘制两条垂直相交的直线:以其交点为圆心, ...

  5. 使用OpenGL绘制三维场景

    计算机图形学(OpenGL版) (第3版) COMPUTER GRAPHICS USING OpenGL 清华大学出版社 三维变换:在三维场景中如何把物体变换到所需的位置和朝向.(OpenGL 提供所 ...

  6. OpenGL之建立三维坐标网格

    OpenGL之建立三维坐标网格 By Cracent 之前的一件作品,在此与大家分享一下: 这件作品里面涉及到了三维坐标网格的建立,本文将进行代码解析. 1.网格建立函数 void CMyStatic ...

  7. Python 的练手项目:用Python创建一张三维立体画

    本项目生成的三维立体画设计为用"墙眼"方式观看.看到它们的最好方法,就是让眼睛聚焦在图像后面的点(如墙上).有点神奇,一旦在这些图案中感知到某样东西,眼睛就会自动将它作为关注的焦点 ...

  8. 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )

    文章目录 一.OpenGL 状态机概念 二.OpenGL 矩阵概念 上一篇博客 [OpenGL]八.初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗 ...

  9. C++ Opengl 绘制纹理字符源码

    C++ Opengl 绘制纹理字符源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1, ...

最新文章

  1. 入门深度学习,但你知道哪些情况下不该使用深度学习吗?
  2. Mondrain支持kylin问题解决
  3. Matlab中imagesc用法
  4. Quartz Java resuming a job excecutes it many times--转
  5. 1139 First Contact (30 分)【难度: 一般 / 知识点: 模拟】
  6. GNU C 中的零长数组
  7. C#网络编程(同步传输字符串) - Part.2
  8. anaconda配置虚拟环境
  9. EXCEL 制作下拉选项,限制输入内容范围
  10. Atitit 软件知识点分类体系 分类 按照书籍的分类 学科分类 体系与基础部分 计算机体系结构 硬件接口技术(usb,agp,pci,div,hdmi) os操作系统 中间件 语言部分
  11. 网友刷屏:秃了秃了!黑马Java项目教程上新
  12. NiFi 学习 —自己实现处理器
  13. 版本名称SNAPSHOT、alpha、beta、release、GA含义
  14. 微信小程序开发-view视图组件
  15. Aseprite Dark Mort HD 主题
  16. 218分照样可以成为同声传译研究生3
  17. 机器学习(六)统计学习理论
  18. AT89C51单片机共阳极数码管动态显示(汇编语言)
  19. 混音合成效果器:Cradle The God Particle for Mac
  20. python爬取武汉二手房房价

热门文章

  1. django考点答案
  2. 基于OpenCV的混凝土裂纹检测
  3. 路由器基本配置、静态路由
  4. 海康工业相机USB相机问题排查思路—Windows 系统
  5. 京东数据中心主要基础设施系统(一)
  6. GaussDB表设计最佳实践
  7. 北京通州规划图全面汇总
  8. Python3 浮点数精度问题
  9. OpenCV每日函数 Subdiv2D类平面细分
  10. Learning Local Search Heuristics for Boolean Satisfiability 2020-04-30