数字媒体技术专业计算机图形学课程设计报告院系:印包学院专业班级:媒体121学生学号: 3120342001学生姓名:孔祥倩指导教师:吴学毅2014年秋季学期目录一.课程设计的目的 (2)二.课程系统描述实现及步骤 (2)三.设计内容 (3)四.源程序代码 (4)五.总结 (19)六.参考文献 (20)七.附录 (20)一、课程设计的目的OpenGL即开放性图形库,它是一种高性能的开放式且功能强大的3D图形库,具有几百个指令和函数。
本文讨论了两种将常见三维模型转入OpenGL 中实现交互的方法,首先对文件进行分析,然后给出转化的思路。
从而将三维建模软件产生的三维模型移植到三维场景中,实现仿真.本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。
在学期期末时按课程要求进行运动,提高学生对计算机图形学知识的了解与运用技巧同时通过此次课程设计提高动手实践能力与学习分析能力这就是本次的课OpenGL的英文全称是“Open Graphics Library”即“开放的图形程序接口”,因为其良好的可移植性和跨平台性,已逐渐成为高性能图形开发和交互式视景仿真的国际图形标准。
它是一种高性能的开放式且功能强大的3D图形库,具有几百个指令和函数。
使用这些指令和函数可以构造出高质量的静止物体模型和动态图像,并且可以实现对模型的实时交互操作过程。
但是OpenGL中并没有提供建模的高级命令,其实现过程也是通过基本的几何图元点、线和多边形来建立三维立体模型的,过程比较繁琐,编程量较大。
二.课程系统描述实现及步骤此次课程设计的课题为利用VC++6.0和插件OPENGL制作三维模型。
本设计主要通过建立MFC工程,在工程里建立一个三维模型,来建立一个动态的三维模型。
设计一个小院子,其中有房子,树木,桌凳,月亮的一系列景物。
运行程序,实现在这个小院子中的漫游。
主要步骤如下: 1:工程的建立2:三维模型的建立和映射 3:三维模型的运动一:工程的建立 1:系统配置。
先对机子安装VC++6.0.在建立工程前,本实验需要添加OPENGL插件,故需要在Windows环境下安装GLUT步骤如下:1、将下载的压缩包解开,将得到5个文件2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。
把解压得到的glut.h放到这个文件夹。
3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。
4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(典型的位置为:C:\Windows\System32)然后建立一个OpenGL工程测试这里以VisualStudio2005为例。
选择File->New->Project,然后选择Win32 Console Application,选择一个名字,然后按OK。
在谈出的对话框左边点Application Settings,找到Empty project 并勾上,选择Finish。
然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。
2:建立工程。
新建一个MFC文件。
命名为plmy2.而其中的三维建模画图主要程序在程序三.设计内容设计思路1. 大多有显示列表如:树木,桌凳。
void stool(){stoollist=glGenLists(1);glNewList(stoollist,GL_COMPILE);glPushMatrix();glScalef(0.8,1,0.8);glutSolidSphere (4.0 ,10,10);glPopMatrix();glTranslatef(0,4,0);glScalef(1,0.1,1);glutSolidCube(5.0);glEndList();}其中,可以对做好的一个进行缩放,以达到以一个得到多个不同大小的物品。
而树和桌凳底座可以有简单椭圆代替。
这个可有对于圆的不规则缩放完成。
房子主题可以由正方体绘制,房顶由圆锥体绘制。
房子的门,窗户,可有正方体绘制出,将其摆在该放置的位置,利用缩放函数,将其缩放,使得门窗更加立体。
2.关于场景内纹理贴图由大量的浮点数组成,这些浮点数包含了模型面、材质、顶点、法线和纹理等的全部信息,并按照这些属性分类。
然后我们在OpenGL程序中专门定义一个读取模型参数的类,在此类中实现读取相应的浮点数的函数的所有功能,再在主程序中调用。
这段代码运行后,这些变量中就会存入对应表示相应属性的数据。
最后再编程遍历所有的顶点,法线,纹理,从而生成模型。
关于月亮的贴图,利用二次曲面贴图实现。
4.源程序代码#include <GL/glut.h>#include<math.h>#include<windows.h>#include<stdlib.h>#include <stdio.h>#include<Windows.h>#include<mmsystem.h>#pragma comment(lib."winmm.lib")//--------------------------------------------------------------------float flag=1.0;GLfloat theta=3.1415*0.2,fai=3.1415*0.7;GLfloat P0X=120.0*sin(theta)*sin(fai),P0Y=120*cos(fai),P0Z=120.0*cos(theta)*sin(fai);int windoww,windowh; //窗口的宽和高static GLuint texName; //纹理组的名称//依序为月亮、侧面、地面GLuint drawwalllist,moonlist,rooflist,treelist,stoollist,startList; //贴环境纹理的显示列表GLUquadricObj *qobj;//------------------------------------------------------------GLfloat ctrlpoints[4][4][3];GLfloat texpts[2][2][2] = {{{0.7, 0.7}, {0.7, 1}},{{1, 0.7}, {1, 1}}};//-------------------------------------------------------------void readimage(char* filename,BYTE* imagedata)//所读图片均为24位bmp,且宽度补齐至四字节边界{BITMAPFILEHEADER bf; //文件头BITMAPINFOHEADER bi; //信息头int m_ImageWidth; //图象宽度int m_ImageHeight; //图象高度FILE *fp1; //文件指针,fp1为源文件//打开文件,到文件指针if((fp1=fopen(filename,"rb"))==NULL){MessageBox(NULL,"文件打开错误","warning",MB_OK);}fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1); //读取文件头,读取以后文件指针在文件头末尾(即信息头)fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1); //读取信息头m_ImageWidth=bi.biWidth; //给图象宽度赋值m_ImageHeight=bi.biHeight; //给图象高度赋值fread(imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1); //读取图象数据fclose(fp1);}//----------------由于读进来的图记录顺序为BGR---------------------------void adjustimage(BYTE* imagedata,int w,int h){BYTE temp;for(int i=0;i<w*h;i++){temp=imagedata[i*3];imagedata[i*3]=imagedata[i*3+2];imagedata[i*3+2]=temp;}}//------------------------设置纹理----------------------------------void loadtexture(){ //侧面的纹理glGenTextures(5, &texName);glBindTexture(GL_TEXTURE_2D, texName);{BYTE imagemoon[256][256][3]; //月亮的纹理readimage("moon.bmp",&imagemoon[0][0][0]);adjustimage(&imagemoon[0][0][0],256,256);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagemoon);}{BYTE imagesky[256][64][3];readimage("starlow.bmp",&imagesky[0][0][0]);adjustimage(&imagesky[0][0][0],256,64);glBindTexture(GL_TEXTURE_2D, texName+1);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256,64, 0, GL_RGB, GL_UNSIGNED_BYTE, imagesky);}{BYTE imagefloor[256][256][3]; //地面的纹绠readimage("floor.bmp",&imagefloor[0][0][0]);adjustimage(&imagefloor[0][0][0],256,256);glBindTexture(GL_TEXTURE_2D, texName+2);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagefloor);}{BYTE imagedoor[256][256][3]; //栅栏面的纹理readimage("door.bmp",&imagedoor[0][0][0]);adjustimage(&imagedoor[0][0][0],256,256);glBindTexture(GL_TEXTURE_2D, texName+3);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagedoor);}{BYTE imageroof[128][128][3]; //屋顶的纹理readimage("roof.bmp",&imageroof[0][0][0]);adjustimage(&imageroof[0][0][0],128,128);glBindTexture(GL_TEXTURE_2D, texName+4);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 128,128, 0, GL_RGB, GL_UNSIGNED_BYTE, imageroof);}}//---------------------光照---------------------------------void loadlight(){GLfloat light_ambient[]={0.8,0.8,0.8,1.0};GLfloat light_diffuse[]={0.6,0.6,0.6,1.0};GLfloat light_specular[]={0.6,0.6,0.6,1.0};GLfloat light_position[]={30.0,60.0,50.0,0.0};glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);}void material(GLfloat ambR,GLfloat ambG,GLfloat ambB,GLfloat difR,GLfloat difG,GLfloat difB,GLfloat speR,GLfloat speG,GLfloat speB){GLfloat mat_ambient[]={ambR,ambG,ambB,1.0};GLfloat mat_diffuse[]={difR,difG,difB,1.0};GLfloat mat_specular[]={speR,speG,speB,1.0};glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);}//--------------------贴环境纹理-------------------------------void drawWalls(){/*static GLint WallsVertices[] = {-10, -10, -10, 010,-10,-10, 110,10,-10,2-10,10,-10,3-10,-10,10,410,-10,10,510,10,10,6-10,10,10};7GLubyte frontIndices[] = {6,5,4,7};GLubyte rightIndices[] = {2,1,5,6};GLubyte bottomIndices[] = {0, 4, 5, 1};GLubyte backIndices[] = {3,0,1,2};GLubyte leftIndices[] = {7,4,0,3};GLubyte topIndices[] = {3,2,6,7};*/drawwalllist=glGenLists (1);glNewList (drawwalllist, GL_COMPILE);glDisable(GL_LIGHTING);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName+3);glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0); glVertex3f(-150, -100, -150);glTexCoord2f(1.0, 0.0); glVertex3f(150,-100,-150);glTexCoord2f(1.0, 1); glV ertex3f(150,100,-150);glTexCoord2f(0.0, 1); glV ertex3f(-150,100,-150);glTexCoord2f(0.35, 0.35); glVertex3f(-150,100,-150);glTexCoord2f(0.35, 1.0); glV ertex3f(150,100,-150);glTexCoord2f(1.0, 1.0); glVertex3f(150,100,150);glTexCoord2f(1.0, 0.35); glV ertex3f(-150,100,150);glEnd();glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName+1);glBegin(GL_QUADS);glTexCoord2f(0.0, 1.0); glVertex3f(150,100,-150);glTexCoord2f(0.0, 0.0); glVertex3f(150,-100,-150);glTexCoord2f(1.0, 0.0); glVertex3f(150,-100,150);glTexCoord2f(1.0, 1.0); glVertex3f(150,100,150);glTexCoord2f(0.0, 1.0); glVertex3f(150,100,150);glTexCoord2f(0.0, 0.0); glVertex3f(150,-100,150);glTexCoord2f(1.0, 0.0); glVertex3f(-150,-100,150);glTexCoord2f(1.0, 1.0); glVertex3f(-150,100,150);glTexCoord2f(1.0, 1.0); glVertex3f(-150,100,-150);glTexCoord2f(0.0, 1.0); glVertex3f(-150,100,150);glTexCoord2f(0.0, 0.0); glVertex3f(-150,-100,150);glTexCoord2f(1.0, 0.0); glVertex3f(-150,-100,-150);glEnd();glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName+2);glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0); glVertex3f(150, -100, -150);glTexCoord2f(1.0, 0.0); glVertex3f(-150,-100,-150);glTexCoord2f(1.0, 1.0); glVertex3f(-150,-100,150);glTexCoord2f(0.0, 1.0); glVertex3f(150,-100,150);glEnd();glDisable(GL_TEXTURE_2D);glEnable(GL_LIGHTING);glEndList();}//--------------------------------------------------------void Moon(){moonlist=glGenLists(1);glNewList(moonlist,GL_COMPILE);glDisable(GL_LIGHTING);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_2D);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName);gluSphere(qobj, 25, 20, 20);glDisable(GL_TEXTURE_GEN_S);glDisable(GL_TEXTURE_GEN_T);glDisable(GL_TEXTURE_2D);glEnable(GL_LIGHTING);glEndList();}//---------------------------------------------------------void roof(){rooflist=glGenLists(1);glNewList(rooflist,GL_COMPILE);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_2D);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName+4);glutSolidCone(50,50,10,10);glTranslatef(-50,0,30);glutSolidCone(50,50,10,10);glDisable(GL_TEXTURE_GEN_S);glDisable(GL_TEXTURE_GEN_T);glDisable(GL_TEXTURE_2D);glEndList();}//-------------------treelist----------------------void tree(){treelist=glGenLists(1);glNewList(treelist,GL_COMPILE);glPopMatrix();glPushMatrix();material(0.2,0.1,0.1,0.2,0.1,0.1,0.0,0.0,0.0);glTranslatef(0,10,0);glRotatef(-90,1,0,0);gluCylinder(qobj,6,2,40,20,10);glPopMatrix();glPushMatrix();glTranslatef(0,75,0);material(0.1,0.3,0.1,0.1,0.3,0.1,0.0,0.0,0.0);glScalef(0.7,1,0.7);gluSphere(qobj,30,20,20);//---------slope--------------------glPopMatrix();glPushMatrix();glScalef(0.6,1,0.6);glRotatef(-90,1,0,0);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName+2);glEvalMesh2(GL_FILL, 0, 20, 0, 20);glDisable(GL_TEXTURE_2D);glEndList();}//------------stool-----------------------------------------void stool(){stoollist=glGenLists(1);glNewList(stoollist,GL_COMPILE);glPushMatrix();glScalef(0.8,1,0.8);glutSolidSphere (4.0 ,10,10);glPopMatrix();glTranslatef(0,4,0);glScalef(1,0.1,1);glutSolidCube(5.0);glEndList();}//---------------------创建显示列表------------------------void loadlist(){drawWalls(); //贴环境纹理Moon();roof();tree();stool();}//-----------------pond--------------------------------------void pondcaculate(){{int u, v;for (u = 0; u < 4; u++){for (v = 0; v < 4; v++){ctrlpoints[u][v][0]= 40.0*((GLfloat)u - 1.5);ctrlpoints[u][v][1]=40.0*((GLfloat)v - 1.5);if ( (u == 1 || u == 2) && (v == 1 || v == 2)){ctrlpoints[u][v][2]=30;}else{ctrlpoints[u][v][2] =0;}}}}glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,0, 1, 12, 4, &ctrlpoints[0][0][0]);glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2,0, 1, 4, 2, &texpts[0][0][0]);glEnable(GL_MAP2_TEXTURE_COORD_2);glEnable(GL_MAP2_VERTEX_3);glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);}//---------------------初始化-----------------------------------void init (void){glClearColor (0.1, 0.4, 0.8, 0.0);glViewport (0, 0, 500, 500);glMatrixMode (GL_MODELVIEW);glLoadIdentity();glPushMatrix();glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);glDepthFunc(GL_LESS); //深度测试glEnable(GL_DEPTH_TEST);qobj = gluNewQuadric();loadlight();pondcaculate();glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);loadtexture();loadlist();}//------------------------------------------------------------------void display (void){glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Clear display window.glMatrixMode (GL_MODELVIEW);glLoadIdentity();gluLookAt ( 0.0, 0.0, 0.0, P0X, P0Y, P0Z, 0.0, 1.0, 0.0);glPushMatrix();glMatrixMode (GL_PROJECTION);glLoadIdentity();if (windoww <= windowh)glOrtho (-100, 100, -100*(GLfloat)windowh/(GLfloat)windoww, 100*(GLfloat)windowh/(GLfloat)windoww, 0.001, 290.0);elseglOrtho (-100*(GLfloat)windoww/(GLfloat)windowh,100*(GLfloat)windoww/(GLfloat)windowh, -100, 100, 0.001, 290.0);glMatrixMode (GL_MODELVIEW);glPopMatrix();glPushMatrix();//----------环境-------------------glCallList(drawwalllist);//----------月亮---------------------glTranslatef(100,70,50);glCallList(moonlist);//----------小屋--------------------glPopMatrix();glPushMatrix();glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);material(0.2,0.3,0.4,0.2,0.3,0.4,0.0,0.0,0.0);glTranslatef(0,-70,100);glutSolidCube(60.0);glTranslatef(-50,0,0);glScalef(1,2.2,1);glutSolidCube(60.0);glPopMatrix();glPushMatrix();glTranslatef(0,-40,100);glRotatef(-90,1,0,0);glCallList(rooflist);glPushMatrix();material(0.1,0.2,0.3,0.2,0.3,0.4,0.0,0.0,0.0); glTranslatef(0,-80,70);glScalef(0.5,1,0.1);glutSolidCube(40.0);glPopMatrix();glPushMatrix();material(0.1,0.2,0.3,0.2,0.3,0.4,0.0,0.0,0.0); glTranslatef(18,-70,100); glutSolidCube(30.0);glTranslatef(-70,24,-15);glutSolidCube(35.0);//-------tree-----------glPopMatrix();glPushMatrix();glTranslatef(110,-110,110); glPushMatrix();glCallList(treelist);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef(80,-105,70);glPushMatrix();glCallList(treelist);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef(-110,-105,-110); glPushMatrix();glCallList(treelist);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef(110,-115,-110);glCallList(treelist);glPopMatrix();//---------table&stool--------------- glPopMatrix();glPushMatrix();material(0.1,0.1,0.1,0.1,0.1,0.1,0.0,0.0,0.0);glTranslatef(-80,-100,-60);glRotatef(-90,1,0,0);gluCylinder(qobj,3,1.4,15,20,10); glPopMatrix();glPushMatrix();glTranslatef(-80,-85,-60);glScalef(1,0.1,1);glutSolidCube(25);glPopMatrix();glPushMatrix();glTranslatef(-75,-95,-80);glCallList(stoollist);glPopMatrix();glPushMatrix();glTranslatef(-75,-95,-40);glCallList(stoollist);glPopMatrix();glPushMatrix();glTranslatef(-55,-95,-60);glCallList(stoollist);glPopMatrix();glPushMatrix();glTranslatef(-105,-95,-60);glCallList(stoollist);glPopMatrix();//维持平衡glutSwapBuffers ( );}void reshape(int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);windoww=w;windowh=h;}static void special(int k, int x, int y){switch (k){case GLUT_KEY_UP:fai-=0.02;if(fai<=0) fai+=0.05;P0Y=120*cos(fai);P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;case GLUT_KEY_DOWN:fai+=0.02;if(fai>=3.1415) fai-=0.05;P0Y=120*cos(fai);P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;case GLUT_KEY_LEFT:theta+=0.05;P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;case GLUT_KEY_RIGHT:theta-=0.05;P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;default:return;}// glutReshapeFunc(reshape);glutPostRedisplay();}void main (int argc, char** argv){glutInit (&argc, argv);glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowPosition (30, 30);glutInitWindowSize (800, 600);glutCreateWindow ("月色");PlaySound("yinyue.wav",NULL,SND_FILENAME | SND_ASYNC);init ( );glutDisplayFunc (display);glutSpecialFunc(special);glutReshapeFunc(reshape);glutMainLoop ( );}5.总结由于属于初学VC且时间有限,所以对于前台的制作难免也诸多的不足,很多东西都要马上学习查资料并进行初步调试即拿出来使用。