您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 计算机图形学课程设计完本
1中文摘要本次课程设计采用OpenGL来完成。OpenGL是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。本次课程设计是在win7系统下VC++6.0中的win32环境中,通过使用OpenGL所提供的标准库函数,综合图形学里的坐标转换,投影变换,光照以及纹理等知识,实现一个简单的太阳系的运行状况。该系统仅做演示使用,将只包括太阳,地球与月亮,并且不保证相关数据的设定准确性。计算机图形学课程设计目录一、课程设计任务及要求..................................................................1二、需求分析......................................................................................1三、系统设计......................................................................................1四、详细设计......................................................................................24.1初始化的设定.........................................................................24.2光源的位置与观察位置的设定.............................................34.3纹理映射的设置.................................................................34.4各星球球体的绘制.................................................................54.5星球公转轨道.........................................................................74.6人机交互式的实现.................................................................8五、运行调试与分析讨论..................................................................95.1程序运行截图.........................................................................95.2结果分析...............................................................................10六、设计体会与小结........................................................................11七、参考文献....................................................................................12计算机图形学课程设计1一、课程设计任务及要求1.利用OpenGL创建太阳,地球,月亮三个球体。2.实现“月亮绕着地球转,地球绕着太阳转”。3.为太阳,地球,月亮附上不同的纹理。4.具有较好的动画效果,消除闪烁现象。5.其他功能的添加。二、需求分析本次课程设计使用的编译软件为VisualC++6.0。设计中通过调用OpenGL函数库以来完成太阳,月亮,地球的球体绘制与纹理的加载,通过矩阵的变换以实现星球的运动效果。从而模拟出太阳系的运行效果动画。在之后,加入星球的轨道轨迹,使得模拟系统3D效果更加明显。并加入人机交互操作。通过“q,w,e,s,a,d”键来调整观察视角,可以实现全方位对此系统进行观察,使系统具有一定的可操作性。三、系统设计本次课题为:实现太阳系运行动画。系统设计步骤为:1.太阳,地球,月亮三个球体的创建。2.利用坐标矩阵变换表示出三个球体之间的关系,即:地球绕着太阳转,月亮绕着地球转。3.增加光源,材质,选择好视角与窗口裁剪尺寸。4.设计太阳,地球,月亮的纹理映射。5.增加太阳,地球,月亮的自传。6.增加地球与月亮的旋转轨道。7.人机交互式操作的设定。计算机图形学课程设计2系统程序流图如下:初始化设定光源设定各表面材质创建各星球纹理初始化各星球实现星球自转与公转,及轨道并更新屏幕用户操作?否x轴视角的变换y轴视角的变换z轴视角的变换点击关闭按钮是程序开始程序结束图3-1系统流程图四、详细设计4.1初始化的设定思路:将需要使用的OpenGL库中的函数进行初始化,例如:光源,材质,绘图函数等。详细代码如下:voidInitial(){计算机图形学课程设计3GLfloatlight_diffuse[]={1.0f,1.0f,1.0f,1.0f};//材质设置GLfloatlight_ambient[]={0.0f,0.5f,0.5f,1.0f};glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT1,GL_AMBIENT,light_ambient);glEnable(GL_DEPTH_TEST);//启用深度测试glFrontFace(GL_CCW);//指定逆时针绕法表示多边形正面g_text=gluNewQuadric();//创建2次几何体gluQuadricTexture(g_text,GL_TRUE);//可以加载贴图glEnable(GL_TEXTURE_2D);//开启纹理}4.2光源的位置与观察位置的设定思路:利用OpenGL库函数glLightfv()对光源的位置进行设定,用函数gluLookAt()对视角观察位置进行设置。详细代码为下://设置光源的位置GLfloatposition[]={1.0f,1.0f,1.5f,0.0f};glLightfv(GL_LIGHT1,GL_POSITION,position);gluLookAt(c,a,b,0,0,-30,0,1,0);//观察角度其中光源设置为方向光源,函数gluLookAt()中的函数包括三对坐标(从左到右),可理解为:第一对参数为人体脑袋所在位置(x,y,z),第二对参数为眼睛所看的位置(x,y,z),第三对参数表示为脑袋所朝向的位置,为向量坐标。其中的“c,a,b”可通过键盘的设定改变值,从而使得观察视角可以进行移动,此功能在下面有介绍。4.3纹理映射的设置思路:利用函数LoadBMP()确认是否存在图片所在的文件夹,再利用函数LoadGTextures()将图片加载成纹理,存储在数组texture中。函数代码为:计算机图形学课程设计4AUX_RGBImageRec*LoadBMP(char*Filename){FILE*File=NULL;if(!Filename)//确保文件名已提供。{returnNULL;//如果没提供,返回NULL}File=fopen(Filename,r);if(File)//文件存在么?{fclose(File);//关闭句柄returnauxDIBImageLoad(Filename);//载入位图并返回指针}returnNULL;}intLoadGLTextures(char*Filename){//a=255;intStatus=FALSE;AUX_RGBImageRec*TextureImage[3];memset(TextureImage,0,sizeof(void*)*1);if(TextureImage[0]=LoadBMP(Filename)){Status=TRUE;glGenTextures(1,&texture[0]);glBindTexture(GL_TEXTURE_2D,texture[0]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]-sizeX,TextureImage[0]-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]-data);}计算机图形学课程设计5glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//线形滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);if(TextureImage[0])//纹理是否存在{//a=255;if(TextureImage[0]-data)//纹理图像是否存在{free(TextureImage[0]-data);//释放纹理图像占用的内存}free(TextureImage[0]);//释放图像结构}returnStatus;}在绘制星球前,直接调用函数LoadTextures(“图片所在位置”),加载的图片将成为纹理,存储在texture[0]中,启用纹理后,绘制出来的图形将被附上当前纹理。4.4各星球球体的绘制设定自转轴:即在绘图区进行移动前设定图形绕轴旋转,便可形成星球的自转。设定公转轴:移动绘图区,通过移动的距离与设定图形绕轴旋转,即形成星球公转。导入纹理:通过LoadGLTextures()函数加载图片,编程纹理存储在texture[0],再通过函数glBindTexture(GL_TEXTURE_2D,texture[0])将当前纹理设置成texture[0]所存储的纹理,即可加载所需的图片。绘制球体:加载函数gluSphere()设定半径大小与图像细腻度绘制出要求的图形。详细代码入下:计算机图形学课程设计6//绘制太阳glRotatef(fElect3,0.0f,1.0f,0.0f);//太阳的自转设置glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);LoadGLTextures(tex/1.bmp);glBindTexture(GL_TEXTURE_2D,texture[0]);glColor3f(255,0.0f,0.0f);gluSphere(g_text,18,128,128);glBindTexture(GL_TEXTURE_2D,0);glDisable(GL_LIGHTING);glPushMatrix();//绘制地球glEnable(GL_LIGHT1);glRotatef(fElect1-fElect3,0.0f,1.0f,0.0f);//地球的公转设置glColor3f(1.0f,1.0f,1.0f);LoadGLTextures(tex/2.bmp);glBindTexture(GL_TEXTURE_2D,texture[0]);glTranslatef(50.0f,0.0f,0.0f);//平移一段距离glRotatef(fElect3,0.0f,1.0f,0.0f);//地球自转设置gluSphere(g_text,9,64,64);glBindTexture(GL_TEXTURE_2D,0);//绘制月亮glColor3f(1.0f,1.0f,1.0f);LoadGLTextures(tex/3.bmp);glBindTexture(GL_TEXTURE_2D,texture[0]);glRotatef(fElect2-fElect3,0.0f,1.0f,0.0f);//月亮
本文标题:计算机图形学课程设计完本
链接地址:https://www.777doc.com/doc-7319167 .html