您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 计算机研究性教学第二次报告
《计算机辅助设计与制造》研究性教学专题之二基于OpenGL的图形几何变换功能实现学院:机械与电子控制工程学院专业:机械工程机自动化课程编号:20L336Q组编:第三组组长:徐梓淳组员:张学敏苑弘瑞李宗凯指导教师:梵文刚日期:2016.5.10基于OpenGL的图形几何变换功能实现2目录一、研究目的......................................................................................3二、研究专题背景..............................................................................3三、小组研究内容..............................................................................4四、程序..............................................................................................51)主体程序...........................................................................................................52)程序备注...........................................................................................................9五、功能实现情况............................................................................10六、总结............................................................................................12七、组内分工....................................................................................12八、参考文献....................................................................................13基于OpenGL的图形几何变换功能实现3一、研究目的(1)几何变换是CAD/CAM技术的基本功能,课堂主要讲授CAD图形的几何变换原理,包括二维图形和三维图形的平移、旋转、缩放、对称以及透视变换等。本次专题是利用OpenGL软件包,实现CAD图形的几何变换功能,实现理论与实践的结合。(2)OpenGL是行业领域中最为广泛接纳的2D/3D图形软件包,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。任何一款CAD软件都必须具备模型显示的功能,本研究专题利用OpenGL将STL文件显示出来,并实现其几何变换,使学生初步掌握CAD软件的开发技能。(3)提供给学生一个做学术研讨的机会,培养学生与他人沟通的能力,培养团队合作的习惯与意识。通过事先布置具有一定难度和工作量的任务,要求学生在课堂利用PPT汇报本组的方法与成果,促使学生团队合作讨论方案,再分工实施,最后汇总形成整体方案。二、研究专题背景本专题从任课教师的科研项目中提取出的一部分内容,指导教师提供一个软件雏形模板,是Vc++编程环境下的win32控制台应用程序,具有STL大文件数据的读取、显示功能,也能通过键盘交互实现图形的平移和旋转等功能。图1是本次专题提供的模版程序执行结果,该程序读取并显示了一个F1方程式赛车的STL文件模型,同时使用了OpenGL的光照相关函数,增强了显示效果。该赛车模型的大小接近60M,但是模版程序仍然可以流畅地显示图形及其变换过程,显示了C++的高效性。基于OpenGL的图形几何变换功能实现4图1读取并显示F1赛车STL模型三、小组研究内容在指导教师给定的CAD几何变换源代码基础上,参照现有CAD/CAM软件(如MasterCAM、SolidWorks等)的操作风格和模式,利用OpenGL软件包的功能和Vc++语言,增加几何变换的功能。教师提供的软件源代码参见文件ViewSTL.cpp和myOpenglEnv.h,另提供一STL文档。OpenGL库函数从网上下载,包括*.h、*.lib、*.dll文档。OpenGL编程环境设置参见附件2。具体研究内容:实现CAD图形的视图功能,能生成STL图形的前、后、左、右、上、下视图和等轴测视图,可添加图标操作功能。CAD图形如下:基于OpenGL的图形几何变换功能实现5四、程序1)主体程序#includestdafx.h#defineGLUT_DISABLE_ATEXIT_HACK#includeGL/glut.h#includelist#includefstreamusingnamespacestd;typedefstructtagTrip{GLdoublem_normal[3];GLdoublem_vex[3][3];}Trip,*pTrip;typedeflistTripTripList;TripListm_list;voidReadFile(constchar*filename){ifstreamfin;fin.open(filename,ios::binary);charbuff[100]={0};intnum=0;fin.read(buff,80);fin.read((char*)&num,4);floata;for(inti=0;inum;i++){pTripptemp=newTrip;//读法向量for(inti=0;i3;i++)基于OpenGL的图形几何变换功能实现6{fin.read((char*)&a,4);ptemp-m_normal[i]=a;}//读三个顶点for(inti=0;i3;i++){for(intj=0;j3;j++){fin.read((char*)&a,4);ptemp-m_vex[i][j]=a;}}fin.read(buff,2);m_list.push_back(*ptemp);deleteptemp;}fin.close();}voidupwardview(){glRotatef(-90,1.0,0.0,0.0);//仰视图}voidleftview(){glRotatef(90,0.0,0.0,1.0);//左视图}voidrightview(){glRotatef(-90,0.0,0.0,1.0);//右视图}voidbackview(){glRotatef(180,0.0,0.0,1.0);//后视图}voidtopview(){glRotatef(90,1.0,0.0,0.0);//俯视图}voidisometricdrawing(){GLfloatm[4][4]={{0.707,0,0.707,0},{0.408,0.816,-0.408,0},基于OpenGL的图形几何变换功能实现7{0,0,1,0},{0,0,0,1}};glMultMatrixf(*m);//正等轴侧视图}voiddisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glBegin(GL_TRIANGLES);TripList::iteratorit;for(it=m_list.begin();it!=m_list.end();it++){glNormal3f(it-m_normal[0],it-m_normal[1],it-m_normal[2]);for(inti=0;i3;i++)glVertex3f(it-m_vex[i][0],it-m_vex[i][1],it-m_vex[i][2]);}glEnd();glFlush();}voidmyReshape(intw,inth){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-200,200,-200*(GLfloat)h/(GLfloat)w,200*(GLfloat)h/(GLfloat)w,-1000.0,1000.0);elseglOrtho(-200*(GLfloat)w/(GLfloat)h,200*(GLfloat)w/(GLfloat)h,-200,200,-1000.0,1000.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(100.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0);}voidKeyPressFunc(unsignedcharkey,intx,inty){switch(key){case'a':leftview();break;case'd':rightview();break;case'w':基于OpenGL的图形几何变换功能实现8upwardview();break;case's':backview();break;case'm':topview();break;case'n':isometricdrawing();break;default:break;}glutPostRedisplay();}voidmyinit(void){GLfloatlight_position[]={1.0,1.0,1.0,0.0};glClearColor(1,1,1,0);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);glShadeModel(GL_SMOOTH);//glShadeModel(GL_FLAT);}voidmain(intargc,char*argv[]){char*file[]={test1.stl,test2.stl,test3.stl,test4.stl,test5.stl,test6.stl,test7.stl};inti=4;printf(输入需要打开的文件[1]~[7]\n);scanf(%d,&i);ReadFile(file[i-1]);glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);glutInitWindowSize(800,600);glutCreateWindow(3DEffectsDemo);myinit();glutReshapeFunc(myReshape);基于OpenGL的图形几何变换功能实现9glutKeyboardFunc(KeyPressFunc);glutDisplayFunc(display);glutMainLoop();}2)程序备注gluLookAt函数:voidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,GLdoublecentery,GLdoublecenterz,GLdoubleupx,GLdoubleupy,GLdoubleupz);该函数定义一个视图矩阵,并与当前矩阵相乘。第一组eyex,eyey,eyez相机在世界坐标的位置第二组
本文标题:计算机研究性教学第二次报告
链接地址:https://www.777doc.com/doc-4627854 .html