基于opengl的立体模型库本科论文文档格式.docx
《基于opengl的立体模型库本科论文文档格式.docx》由会员分享,可在线阅读,更多相关《基于opengl的立体模型库本科论文文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
在该窗口里面能实现对三维模型的浏览、旋转和缩放。
这一部分是该软件的基础部分,也是最底层的框架结构。
第二个模块就是ACCESS的数据库管理模块。
这个模块是通过ACCESS建立三维立体图形的数据库,并对数据库实现查看、添加和删除。
然后,通过VisualC++编程将OpenGL的三维模型处理窗口模块与ACCESS的数据库管理模块结合起来。
这样这个软件就成型了。
通过这个软件可以在数据库里面调用三维模型的数据来在OpenGL窗口里面查看三维立体图形,这样就更形象的理解与操作三维立体模型。
也可以在窗口上实现智能化、形象化的三维立体模型数据库管理。
从而实现更高效、交互式的三维立体模型库的管理。
2设计中所用的软件及接口技术简介
在该软件程序设计共用了三个软件及接口技术:
VisualC++、OpenGL、Access。
2.1VisualC++简介
VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序软件。
VisualC++是一个功能强大的可视化软件开发工具。
自从1993年Microsoft公司推出VisualC++1.0后,随后其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选编程软件。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用有很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0操作系统下。
所以在实际的软件开发中,更多的是以VisualC++6.0为开发平台。
VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发组件工具包。
2.1.1VisualC++组成部分
VisualC++由三个部分组成:
DeveloperStudio、MFC、PlatformSDK。
(1)DeveloperStudio,它是VisualC++的一个集成开发环境,我们日常工作的99%都是在它上面完成程序开发的,加上它的标题赫然写着“MicrosoftVisualC++”,所以很多人都理所当然的认为,那就是VisualC++了。
其实不是这样的,虽然DeveloperStudio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能。
其实DeveloperStudio并不是只用于VC的,它也同样用于VB,VID等VisualStudio家族的其他同胞兄弟。
所以不要把DeveloperStudio当成VisualC++,它仅仅只是VisualC++的一个壳子。
(2)MFC,如果从理论上来讲,MFC也不是仅仅专用于VisualC++,BorlandC++,C++Builder和SymantecC++同样可以处理MFC。
同时,用VisualC++编写代码也并不意味着一定要用MFC,如果可以,用VisualC++中的STL,ATL编写程序也是一样没有限制的。
但是,VisualC++很多功能本来就是为MFC打造的,VisualC++中的许多特征和语言扩展也是为MFC而设计的,所以用VisualC++而不用MFC就相当于抛弃了VisualC++中很大的一部分功能。
(3)PlatformSDK,这才真正是VisualC++和整个VisualStudio的主要部分,即使我们很少直接的接触到它。
大致说来,PlatformSDK是以MicrosoftC/C++编译器为核心,辅以其他一些工具和文档资料。
上面说到DeveloperStudio没有编译程序的功能,所以这项工作是由CL、NMAKE和其他许许多多命令行程序来完成的。
这些我们所看不到的程序才是构成VisualStudio的基础。
2.1.2VisualC++6.0的使用方法
启动MicrosoftVisualC++6.0(其启动界面如图下图2.1)
图2.1
选择:
“文件”下的“新建”选项,在打开的对话框中选择“工程”选项
再选择你所需要的工程类型->
填写“工程名称”->
选择工程存储“位置”->
点击“确定”.
然后再选择:
“文件”下的“新建”选项,在打开的对话框中选择“文件”
再选择“C++Sourcefile”->
填写“文件名称”->
这样就建好了一个.cpp的工程文件。
然后你在.cpp文件中写入你的c语言代码就可以了。
代码写好以后你看一下工具里有这样一个图标
依次点,编译,运行就可以了。
2.2OpenGL简介
OpenGL是一个开放式的三维图形软件包,它是独立于窗口系统和操作系统的,以它为基础开发的应用程序可以十分方便地在各种平台之间移植;
OpenGL可以与VisualC++紧密结合.OpenGL具有七大功能:
1.建模:
OpenGL图形库不仅提供了基本的点、线、多边形的绘制函数,此外还提供了复杂的三维物体以及复杂曲线及曲面的绘制函数。
2.变换:
OpenGL图形库的变换包括一些基本变换和投影变换。
基本变换也即平移、旋转、缩放变换,投影变换包括平行投影(又称正射投影)和透视投影两种。
这些变换有利于减少算法的运行时间,提高三维立体图形的显示速度。
3.颜色模式设置:
OpenGL颜色模式有两种,即RGBA模式和颜色索引(ColorIndex)。
4.光照和材质设置:
OpenGL光有辐射光(EmittedLight)、环境光(AmbientLight)、漫反射光(DiffuseLight)和镜面光(SpecularLight)。
材质是用光反射率来表示。
场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
5.纹理映射(TextureMapping):
利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
从而感受到其三维立体图形的效果。
6.位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。
以上三条可使被仿真物更具真实感,增强图形显示的效果。
7.双缓存动画(DoubleBuffering):
双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
图2.2是OpenGL的运行平台和结构[3]。
图2.2
2.2.1VisualC++中OpenGL编程的环境配置
要在VisualC++中编写OpenGL的程序需要做如下配置:
首先,将OpenGL开发库的Glu.dll、Glut32.dll、Glut.dll三个文件拷贝到操作系统的system32文件夹中。
然后,将OpenGL开发库中的Gl.h、Glaux.h、Glext.h、Glu.h、Glut.h、Wglext.h这六个文件拷贝到VisualC++的“include\gl”文件夹下。
最后,将OpenGL开发库中的Glaux.lib、Glu32.lib、Glut32.lib、OpenGL.lib四个文件拷贝到VisualC++的静态函数库文件“VC\lib”文件夹下。
至此在VisualC++中OpenGL的编程环境就配置好了,这样就可以进行OpenGL的编程了。
2.3Access数据库的简介
Access是微软公司推出的基于Windows的桌面关系数据库管理系统(RDBMS,即RelationalDatabaseManagementSystem),是Office系列应用软件之一[2]。
它提供了表、查询、窗体、报表、页、宏、模块7种用来建立数据库系统的对象;
提供了多种向导、生成器、模板,把数据存储、数据查询、界面设计、报表生成等操作规范化;
为建立功能完善的数据库管理系统提供了方便,也使得普通用户不必编写代码,就可以完成大部分数据管理的任务。
Access能够存取Access/Jet、MicrosoftSQLServer、Oracle(甲骨文软件公司),或者任何ODBC兼容数据库内的资料。
熟练的软件设计师和资料分析师利用它来开发应用软件,而一些不熟练的程序员和非程序员则能使用它来开发简单的应用软件。
虽然它支持部分面向对象(OO)技术,但是未能成为一种完整的面向对象开发工具。
2.3.1Access与SQL的区别
Access是一种桌面数据库,只适用于数据量少的数据库。
在处理少量的数据和单机访问的数据库是具有很高的效率。
但是它的同时访问客户端不能多于四个。
Access数据库有一定的极限,当数据达到100M左右时,很轻易造成服务器的iis假死,或者消耗掉服务器的内存导致服务器崩溃。
SQL是基于服务器的中型的数据库,可以适合大容量的数据的应用,在功能上治理也比Access要强得多。
在处理大量数据的效率上,后台开发的灵活性,的扩展性等方面要强大得多。
如下表2.2是Access与SQL的区别:
SQL数据库与Access数据库的特征区别
内容
Access特征
SQL特征
版本
桌面版
网络版,可支持跨界的集团公司异地使用
节点
一人工作,要锁定,其他人无法使用
节点多,支持多重路由器
管理权限
否
管理权限划分细致,对内安全性高
防黑客能力
数据库划分细致,对外防黑客能力高
并发处理能力
100人或稍多
同时支持万人在线提交
到处XML格式
可以,需要单做程序
可导出成为XML格式,与Oracle通用
数据处理能力
一般
快
是否被优化过
是
表2.2
由于本设计中数据量比较少,所以选择了适合少量数据的Access数据库。
3系统分析
3.1需求分析
在OpenGL的基础上还有OpenInventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。
其中,OpenInventor应用最为广泛。
该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。
设计这个软件(基于OpenGL的立体模型库软件)主要是目前基于OpenGL的有关软件都是一些绘制或处理三维图形,并没有将日常处理或常用的三维立体图形进行有效的管理,以方便在以后使用相关的三维立体图性。
这个软件能通过VisualC++编程把OpenGL窗口框架(OpenGL窗口框架期望效果如图3.1)与三维立体模型数据库结合,达到高效、交互式的管理三维立体模型。
方便在三维立体图形中的绘制与教学中三维立体模型的查看与管理。
图3.1
3.2可行性分析
要实现该软件主要解决两个问题,怎么实现OpenGL框架与怎么实现数据库?
针对这两问题,首先解决OpenGL的框架问题。
通过OpenGL的库函数,再通过VisualC++编程,这个问题是可以解决的。
在查阅了大量文献后利用OpenGL处理或绘制三维立体模型已经大量的应用了。
然后要建立三维立体模型的数据库。
做这个软件我选择了MicrosoftAccess数据库软件,它是用来处理小型数据库的,所以在这个软件中用Access是比较适合这个程序的,因为这个数据库的数据量比较少,也是做的一个比较简单的数据库。
解决这两个问题的流程图如下(图3.2):
图3.2
4软件总体设计
4.1软件原理分析
该软件所处理的三维立体模型是用Autodesk公司的3DStudioMax绘制的立体模型,它所生成的图形文件格式是3DS文件格式。
3DS文件由许多块组成,每个块首先描述其信息类别,即该块是如何组成的。
3DS格式文件的读入大致可以分为两大部分:
文件内容的读入和3D对象的绘制。
其中文件内容的读入定义了两个类:
CTriObject和CTriList。
CTriObject主要用于处理3DS文件中的各种对象,而CTriList主要用于处理对象序列。
3D对象的绘制主要是在CTriObject中完成的,其外部形状主要是采用三角形来近似的。
该软件是通过软件的数据库管理部分把三维立体模型的数据传送到软件的OpenGL框架窗口中,以达到对三维立体模型的查看、旋转、缩放等处理。
然后,通过该软件也能在其数据库管理界面实现对三维立体模型的查看、删除、添加等管理操作,从而来实现软件对三维立体模型的高效、交互式管理。
其软件原理流程图如下图4.1所示:
图4.1
4.2软件的实现
软件的实现我也是根据前面的模块进行分模块实现的,主要有两大模块:
OpenGL窗口框架和三维立体模型的数据库。
下面就进行分块实现。
4.2.1OpenGL窗口框架的实现
首先设计的是该软件的基础部分——OpenGL窗口框架。
该程序编辑的OpenGL窗口框架是用VisualC++编辑的一个单文档程序。
编程步骤如下:
(1)先启动VisualC++,选择“新建”菜单,在新建对话框中选择“Project”标签,选择“MFCAppWizard(exe)”,这就新建了一个单文档的工程,取名叫:
基于OpenGL的立体模型库如图4.2:
如图4.2
(2)利用MFCClassWizard为OpenGLView类添加消息WM_CREATE、WM_DESTROY、WM_SIZE的响应函数。
这些函数是对这个窗口实现创建、销毁、控制尺寸的。
(3)然后再OpenGLView.h中编辑代码(该程序的详细的代码都不再叙述)。
这段代码主要是添加成员函数和成员变量。
(4)然后在OpenGLView.cpp中编辑代码。
主要是窗口的初始化。
(5)在StdAfx.h中编辑代码。
主要是包含有关OpenGL函数的头文件。
至此,基于单文档的OpenGL窗口的大体框架就做好了(如图4.3)。
但这是还不能读入三维立体模型。
下一步就是要编辑其读入3DS文件的程序。
图4.3
3DS文件的读入首先要通过glStructures.h函数来插入基本的数据结构定义文件。
它主要是定义3DS文件的读入结构。
然后通过basicRead.h来定义数据输入函数。
然后在工程程序中插入一个新的类C3dsReader,该类主要用于处理3DS文件中的各种块的读入。
再在工程中插入一个用于处理3DS文件中各种类对象的类——CTriObject。
再在工程中插入一个用于处理3DS文件显示中的各种列表的类CTriList。
然后再为3DSLoaderView类添加消息函数如:
WM_LBUTONDOWN、WM_LBUTTONUP、WM_RBUTTONDOWN等鼠标消息响应函数。
这些函数的功能是使我们能通过鼠标来控制三维立体模型,从而来达到对三维立体模型的旋转、缩放等。
最后编译、运行,并通过该OpenGL窗口框架打开一个三维立体模型如图4.4所示
图4.4
4.2.2三维立体模型数据库实现
三维立体模型数据文件的格式是3DS。
3DS文件都是分模块的(其块的基本结构如表4.5),最开始的出现的主块是基本块,它包含了整个文件。
还有两种主块:
3D编辑程序块和关键帧块,前者的ID是3D3D,后者的ID是B000.3D编辑程序块表明编辑程序数据开始,也就是说物体的形状数据定义从此处开始。
关键帧块表明下面开始定义关键帧信息。
块内相对偏移量
长度
名称
2
块的ID
4
块的长度
6
n
数据
6+n
m
子块信息
表4.53DS文件块的基本结构
软件所用的数据库系统是MicrosoftAccess数据库。
Access有很多的优点,如下:
(1)存储方式简单,易于维护管理。
Access管理的对象有表、查询、窗体、报表、页、宏和模块,以上对象都存放在后缀为(.mdb或.accdb)的数据库文件中,便于用户的操作和管理。
(2)面向对象Access是一个面向对象的开发工具,利用面向对象的方式将数据库系统中的各种功能对象化,将数据库管理的各种功能封装在各类对象中。
它将一个应用系统当作是由一系列对象组成的,对每个对象它都定义一组方法和属性,用户还可以按需要给对象扩展方法和属性。
通过对象的方法、属性完成数据库的操作和管理,极大地简化了用户的开发工作。
同时,这种基于面向对象的开发方式,使得开发应用程序更为简便。
(3)界面友好(其操作界面如图4.6)、易操作。
Access是一个可视化工具,是风格与Windows完全一样,用户想要生成对象并应用,只要使用鼠标进行拖放即可,非常直观方便。
系统还提供了表生成器、查询生成器、报表设计器以及数据库向导、表向导、查询向导、窗体向导、报表向导等工具,使得操作简便,容易使用和掌握。
图4.6
(4)集成环境、处理多种数据信。
Access基于Windows操作系统下的集成开发环境,该环境集成了各种向导和生成器工具,极大地提高了开发人员的工作效率,使得建立数据库、创建表、设计用户界面、设计数据查询、报表打印等可以方便有序地进行。
(5)Access支持ODBC(开发数据库互连,OpenDataBaseConnectivity),利用Access强大的DDE(动态数据交换)和OLE(对象的联接和嵌入)特性,可以在一个数据表中嵌入位图、声音、Excel表格、Word文档,还可以建立动态的数据库报表和窗体等。
Access还可以将程序应用于网络,并与网络上的动态数据相联接。
(6)支持广泛,易于扩展,弹性较大。
能够将通过链接表的方式来打开EXCEL文件、格式化文本文件等,这样就可以利用数据库的高效率对其中的数据进行查询、处理。
还可以通过以Access作为前台客户端,以SQLServer作为后台数据库的方式(如ADP)开发大型数据库应用系统。
总之,Access是一个既可以只用来存放数据的数据库,也可以作为一个客户端开发工具来进行数据库应用系统开发;
即可以开发方便易用的小型软件,也可以用来开发大型的应用系统。
但ACCESS也有缺点,ACCESS是小型数据库,既然是小型就有它的局限性:
(1)数据库过大,一般百M以上(纯数据,不包括窗体、报表等客户端对象)性能会变差。
(2)虽然理论上支持255个并发用户,但实际上根本支持不了那么多,如果以只读方式访问大概在100个用户左右,而如果是并发编辑,则大概在10-20个用户。
(3)记录数过多,单表记录数过百万性能就会变得较差,如果加上设计不良,这个限度还要降低。
(4)不能编译成可执行文件(.exe),必须要安装Access运行环境才能使用。
下面就开始对三维立体模型建立数据库。
首先打开MicrosoftAccess,然后建立三个表格:
贯穿体表格、柱体表格、组合体表格(如图4.7)。
见这三个表格的原因是我把三维立体模型分成了这三种类型,以便在以后方便数据处理。
这三个三维立体模型库表格的属性有ID、类型、备注。
ID是用来唯一标识一个三维立体模型的码,然后我设置ID为主键。
类型是用来分组三维立体模型的,为了方便以后的三维立体模型数据的管理。
备注是用来填写三维立体模型的存储路径,为了在使用打开时它能把三维立体模型的存储路径传递给OpenGL窗口,以达到在OpenGL窗口中打开三维立体模型。
图4.7
建立好模型的数据库以后就是数据库在软件中的链接了。
我们的数据库管理层是创建的一个对话框窗口管理。
它通过类型的下拉菜单来调用我们的数据库,让他在下面的列表框中显示我们的数据表。
然后在数据列表中选中一项数据记录时,再点击“查看模型”按钮时,它就把选中数据记录的“备注”列中的三维立体模型的存储路径值返回给我们的“查看模型”中,然后OpenGL窗口就会调出三维立体模型把它显示在窗口里面。
从而实现了三维立体模型的查看。
至于实现三维立体模型的添加删除,主要是通过对数据表的操作完成的。
具体就是先调出你要添加的三维立体模型的对应表,然后添加一项新纪录,再把三维立体模型拷贝到该程序专门存放三维立体模型库的文件夹里,它就会自动保存这个数据了。
4.3软件的运行
启动软件打开“文件”,再选择“打开”,通过这个方式能打开没有存进数据库的三维立体模型如图4.8:
图4.8
在启动软件时,选择“模型库管