计算机图形学课程设计.docx_第1页
计算机图形学课程设计.docx_第2页
计算机图形学课程设计.docx_第3页
计算机图形学课程设计.docx_第4页
计算机图形学课程设计.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机图形学课程设计报告题目名称: 球体背面剔除消隐算法 专 业 计算机科学与技术班 级 计科15升-1班学 号 1516353004姓 名 指导教师 王玉琨2016 年 06 月 07 日 目 录 设计内容与要求03 总体目标和要求03 内容与要求03 总体设计03 2.1 球的消隐处理基本原理03 2.2 具体设计实现04 详细设计04 3.1调试后正确的程序清单04 功能实现 08 4.1程序运行结果09 4.2 功能实现及分析09 总结 09 参考文献 10球体背面剔除消隐算法 第 1章 设计内容与要求 1.1 总体目标和要求 课程设计的目的:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现 计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到: 1) 巩固和实践计算机图形学课程中的理论和算法; 2) 学习表现计算机图形学算法的技巧; 3) 培养认真学习、积极探索的精神; 4) 具备通过具体的平台实现图形算法的设计、编程与调试的能力; 5) 完成对实验结果分析、总结及撰写技术报告的能力。 总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大 方,能清楚地演示算法执行的每一个步骤。 开发环境:Viusal C+ 6.0 1.2 内容与要求 球体背面剔除消隐算法 内容: (1)掌握背面剔除消隐算法原理; (2)实现矢量点积与叉积运算; (3)透视投影变换 (4)曲面体经纬线划分方法 功能要求: (1)绘制球体线框模型的透视投影图,使用背面剔除算法实现动态消隐; (2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐; (3)使用键盘的上下左右控制键旋转消隐前后的球体; (4)单击左键增加视距,右击缩短视距; 第2章 总体设计 2.1 球的消隐处理基本原理 球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。网格四边形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起来就越光滑。一般根据实际需要来确定合适的逼近精度即网格多边形数目。当曲面表示为一组网格多边形时,消隐处理的主要工作是确定各网格多边形的可见性,由此可用平面立体的算法对曲面进行消隐处理。球面的参数方程为:x=Rsinacosy=Rsinasin(0a,02)z=Rcosa设两个参数a和对球面进行网格化,当相邻的曲线参数分别为a1、a2、1、2时,构成四边形网格P0P1P2P3,其外法线N表示如下:N=P0P1P1P2对N进行单位化:n=nx,ny,nz=n/|N|若设视方向为S,其平行于y轴:S=0,1,0nS=ny0,网格可见,画出;nS=ny0,网格不可见,不画2.2具体设计实现(1)掌握运行环境VisualC+编程、调试方法,熟练掌握OpenGL的使用,并能将两者相结合完成实验设计;(2)理解球体背面剔除消隐算法的基本原理; (3)利用OpenGL中的函数绘制一个线框球并显示出来。具体方案如下:(a)先通过透视投影变换绘制出小四边形平面片,进行球体线框模型的绘制。(b)完成球体的绘制后,进行设置球体的旋转效果,根据球体背面剔除消隐算法来完成球体的动态消隐。(c)创建右键菜单显示消隐效果,右键菜单有未消隐和消隐两个选项。(d)设置使用键盘的上下左右控制键旋转消隐前后的球体。(e)设置单击鼠标左键增加视距,右击缩短视距。(f)编写主函数,然后编写以上思想的子函数,对整个程序进行基本的代码编写,分模块完成所要求的各个功能,最后进行代码的运行和调试。第3章详细设计 3.1调试后正确的程序清单 #include #include #define NO_XIAOYIN 1 #define XIAOYIN 2 static float a=1.0f,b=0.0f,c=0.0f; GLfloat rtri,r=1.0f; /旋转角度 bool bXiaoyin = true; void init(void) glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glShadeModel(GL_SMOOTH);/设为smooth处理方式 glEnable(GL_DEPTH_TEST);/激活深度测试 void display(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /清除颜色缓存和深度缓存 glLoadIdentity(); glTranslatef(-1.0f,0.0f,-4.0f);/控制球的位置和大小 glRotatef(rtri,a,b,c);/旋转 glColor3f(0.0f,1.0f,0.0f);/控制球的颜色 if(bXiaoyin) glutWireSphere(r, 45, 30 ) /初始化线框球 球体围绕z轴分割45 次,球体沿着z轴分割30次 else glDisable(GL_TEXTURE_2D); glColorMask(0,0,0,0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glPolygonOffset(1.1f, 4.0f); glEnable (GL_POLYGON_OFFSET_FILL); /auxSolidSphere(1.0); glutSolidSphere (r, 45, 30 ) /实心球 glDisable (GL_POLYGON_OFFSET_FILL); glColorMask(1, 1, 1, 1); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); /auxSolidSphere(1.0); glutSolidSphere (r, 45, 30 ) glutSwapBuffers(); /交换双缓存 void reshape (int width, int height) /对屏幕窗口的形状进行调整 glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); void processMenuEvents(int option)/此函数处理根据菜单选项来执行的动作 switch (option) case 1: bXiaoyin = true; glutPostRedisplay(); break; case 2: bXiaoyin = false; glutPostRedisplay(); break; void createGLUTMenus()/创建菜单 int menu; menu = glutCreateMenu(processMenuEvents); glutAddMenuEntry(消隐,XIAOYIN);/在菜单中添加选项 glutAddMenuEntry(未消隐,NO_XIAOYIN); glutAttachMenu(GLUT_RIGHT_BUTTON); void keyboard(unsigned char key, int x, int y) /键盘控制球体的缩放 switch (key) case o: r+=0.1f; glutPostRedisplay(); break; case i: r-=0.1f; glutPostRedisplay(); break; case x: exit(0); break; default: break; void keyboard1(int key,int x,int y) switch(key) case GLUT_KEY_LEFT:/向左旋转 a=0.0f; b=1.0f; c=0.0f; rtri-=2.0f;/减一个角度 glutPostRedisplay();/重画 break; case GLUT_KEY_RIGHT:/向右旋转 a=0.0f; b=1.0f; c=0.0f; rtri+=2.0f;/加一个角度 glutPostRedisplay(); break; case GLUT_KEY_UP:/向上旋转 a=1.0f; b=0.0f; c=0.0f; rtri-=2.0f; glutPostRedisplay(); break; case GLUT_KEY_DOWN:/向下旋转 a=1.0f; b=0.0f; c=0.0f; rtri+=2.0f; glutPostRedisplay(); break; default: break; void mouse(int button, int state, int x, int y)/用鼠标实现放大缩小 switch (button) case GLUT_LEFT_BUTTON: r+=0.1f; glutPostRedisplay(); break; case GLUT_RIGHT_BUTTON: r-=0.1f; glutPostRedisplay(); break; default: break; int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); /使用双缓存模式和深度缓存 glutInitWindowSize(800, 500); /窗口大小 glutInitWindowPosition(200,200);/窗口在屏幕的位置 glutCreateWindow(球体消隐); init(); glutDisplayFunc(display); /注册重绘函数 glutReshapeFunc(reshape);/注册改变窗口形状函数 glutKeyboardFunc(keyboard);/注册键盘动作函数 glutSpecialFunc(keyboard1);/注册特殊键盘动作函数 glutIdleFunc(display);/设置空闲时调用的函数 glutMouseFunc(mouse);/注册鼠标动作函数 createGLUTMenus(); glutMainLoop(); /进入主循环等待事件发生 return 0; 第4章功能实现4.1程序运行结果运行结果如下图所示4.2功能实现及分析此次程序设计运用计算机图形学所学到的知识,基本完成了课程设计所要求的功能。以下为本实验能实现的功能:(1)绘制了一个球体线框模型的透视投影图,并使用背面剔除算法实现动态消隐,利用glutWireSphere(r,45,30)函数初始化一个线框球,球体围绕z轴分割45次,沿着z轴分割30次 (2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐,主要利用processMenuEvents()函数和createGLUTMenus()实现。processMenuEvents()函数体是一个典型的switch语句。(3)使用键盘的上下左右控制键旋转消隐前后的球体;上键由内向外旋转,下键由外向内旋转,左键向左旋转,右键向右旋转。(4)单击左键增加视距,右击缩短视距,同时利用键盘字母“i”实现球体的缩小,字母“o”控制球体的放大,字母“x”为退出窗口界面。 第5章总结 课程设计是对所学课程的一个综合应用,是对所学课程掌握全面与否的检验。由于对OpenGL算法与VC+编程不是很熟悉,在设计过程中遇到了一些困难。不过通过老师、同学的指导,以及自己查阅相关资料,这些疑惑就全部解决了,因此课程设计才得以顺利完成。本次计算机图形学的课程设计,使我对图形学有了更深一步的认识,深切感受到图形学在如今的广泛应用,学到了许多新知识。OpenGL的图形绘制函数有多种,我通过查询资料一一弄懂各个函数的含义。然后根据消隐知识,掌握球体消隐算法的基本原理和算法思想,进而实现了球体的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论