关闭

关闭

关闭

封号提示

内容

首页 VC环境下基于OpenGL与3DS的三维场景重建.pdf

VC环境下基于OpenGL与3DS的三维场景重建.pdf

VC环境下基于OpenGL与3DS的三维场景重建.pdf

上传者: 淡呢 2011-09-19 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《VC环境下基于OpenGL与3DS的三维场景重建pdf》,可适用于IT/计算机领域,主题内容包含ComputerKnowledgeandTechnology电脑知识与技术多媒体技术及其应用本栏目责任编辑:唐一东第卷第期(年月)VC环境下基于Op符等。

ComputerKnowledgeandTechnology电脑知识与技术多媒体技术及其应用本栏目责任编辑:唐一东第卷第期(年月)VC环境下基于OpenGL与DS的三维场景重建李国超刘爽张延超常洪强(大连民族学院计算机科学与工程学院辽宁大连)摘要:通过三维建模软件可以进行快速三维建模但用户的实时交互一直是三维建模软件的最大缺陷。以三维建模软件DMax的DS文件为数据源说明了DS内部数据结构及读取流程重点讨论了如何有效的解析三维数据并以合理的数据结构进行保存在MFCOpenGL框架下以DS文件数据为基础完成三维重建并通过OpenGL绘图命令实现用户的实时交互。关键词:三维建模用户交互DS数据VisualCOpenGL中图分类号:TP文献标识码:A文章编号:()ThreeDimensionalModelingBasedonOpenGLandDSLIGuochao,LIUShuang,ZHANGYanchao,CHANGHongqiang(CollegeofComputerScienceEngineering,DalianNationalitiesUniversity,Dalian,China)Abstract:Threedimensionalmodelingsoftwarehelpstoconstructthreedimensionalmodelsquickly,butmaindisadvantageofthiskindofsoftwareisitsrealtimeinteractionwithusersBasedonDSfileofDMaxsoftwareasdatasource,detailofDSinnerdatastructureandaccessingprocessareexplainedHowtoparsethreedimensionaldataeffectivelyandhowtosavethesedatausingreasonabledatastructurearediscussedindetailUnderframeworkofMFCandOpenGL,threedimensionalmodelingisconstructedbasedonDSdatafile,whileusingOpenGLdrawingfunctiontoimplementrealtimeinteractionwithusersKeywords:threedimensionalmodelinginteractionwithusersDSdataVisualCOpenGLOpenGL是一种强大的三维图形开发工具用户可以通过OpenGL命令根据已有的三维数据交互式的创建所需对象及控制视角或物体的移动。在虚拟现实系统中需要构造一些复杂的模型人们往往直接利用专业建模软件例如DSMax建立需要的模型然而其匮乏的人机交互能力也限制着模型的有效利用。本文介绍了如何在利用DSMax完成建模的情况下结合MFCOpenGL开发环境直接获取DS模型数据然后在OpenGL中进行交互绘制并控制的方法。这种方法一方面可以利用专业建模软件较快地建立比较复杂的模型的优点另一方面利用OpenGL的编程接口对建立的模型进行实时绘制和交互控制提高建模效率加快系统开发进程。本文主要针对DS文件的数据进行分析并解释如何在获取数据后通过OpenGL进行绘制。DS文件数据结构DS文件数据结构简析DS格式作为老字号的三维建模文件格式其内部包含大量的数据信息。读取DS文件首先是理清文件的内部数据结构。DS文件内部是以“块”为单位的。所谓“块”就是指相同类型数据信息的集合但是并不是所有的块都是三维重建所需要的因此需要对需要的块进行挑选幸运的是DS文件中所有的块都是以一个块头为起始的所谓“块头”是指由两个字节保存的块的ID及四个字节保存的块的长度的信息构成的如表。因此只需要知道对应块的ID即可获取该块的数据信息而DS文件中所有的块以树形结构结合在一起就是说大块中包含小块最后归结到一起就是“祖块”其块名为xDD因此可以通过判断文件起始的两个字节是否为xDD来判断文件是否为DS格式祖块的长度即为文件的长度。三维重建所需的块均是祖块的子块或孙块每个块所包含的信息不同所以每块内部的数据结构也并不相同。在一级子块主编辑块中包含了三维重建所需要必要数据信息如对象信息、材质信息等等如图。对象块中包含三维重建所需的最重要的点块和面块以及UV纹理坐标块。收稿日期:基金项目:大连民族学院太阳鸟计划资助项目()作者简介:李国超()男(回族)安徽全椒人研究方向为图像处理刘爽()女(满族)辽宁锦州人通讯作者副教授博士主要研究方向为智能信息处理、计算机教育张延超()男辽宁鞍山人研究方向为计算机复杂性常洪强()男(回族)山东德州人研究方向为智能算法。表文件块头数据结构图DS文件树形结构Email:edufccccnetcnhttp:wwwdnzsnetcnTel:ISSNComputerKnowledgeandTechnology电脑知识与技术Vol,No,December,pp,ComputerKnowledgeandTechnology电脑知识与技术本栏目责任编辑:唐一东多媒体技术及其应用第卷第期(年月)点块中顺序存放着三维场景中所有的点保存了每个点对应三维场景的XYZ坐标存储为两个字节的浮点型也就是说从开始的每连续的三个浮点数对应一个点每个点的ID号就是该点在点块中被读取时的顺序号这样在之后的面块中就可以根据其中保存的索引号找到点块中对应ID号的点。在DS中每个面是由三个点构成的所以在面块中存放着每个面对应三个点在点块中的索引根据点的索引即可搜索到点的三维坐标另外面块中也存放着该面块所包含所有面的对应的材质名称根据材质名称到材质库中查找并将查找到的材质加入包含该面块的对象的材质数组中。三维场景最醒目的当属其中逼真的三维环境其主要由现实世界的图片嵌合在三维物体上实现的而图片与三维物体嵌合的位置则是由UV纹理坐标块决定的。UV纹理坐标是二维坐标每个坐标有两个浮点数构成与之前读取的点块中每个点依次对应所以纹理坐标的数量与点块中点数完全相同。之所以会依次对应是因为纹理坐标块中每个纹理坐标都是针对点块中对应的点图片可以看做是一个二维物体如果将二维物体映射到三维物体上而没有其他参照物的话则必须对这个二维物体进行旋转、移动但如果事先可以确定某一特定的面则不必进行其余操作节省大量资源也就是说应用纹理坐标之前首先由点块中对应的三个点确定一个平面然后再由三个纹理坐标确定该面所贴的贴图的位置同时对象也由这些点确定并绘制的这样一张二维图片即可完美的和一个三维物体嵌合。需要注意的是一张图片可能不仅仅对应一个面可能会映射几个在同一平面或不同平面上的面这是由各个面对应的材质块中指定的纹理贴图来决定的。这里有个事实材质块永远先于点块读取点块永远先于UV纹理坐标块读取UV纹理坐标块永远先于面块读取。DS文件中并不是所有的材质都存放在同一材质块中材质块不等同于材质库所有的材质块组成了材质库而每个对象只是选择材质库中一个或多个材质映射到该对象所包含的各个面中。每个材质块中包含了特点面所需的所有材质的信息包括材质环境光成分、散射光成分、对应贴图名等等。对象块中每个对象通过索引映射材质库中的材质从而绘制出五彩缤纷的三维世界。至此三维重建所需的必要数据信息块就可以获取了。DS文件数据读取流程首先判断打开的文件是否为DS文件。通过块头结构体Typedefstruct{unsignedshortid个字节longlength个字节}ChunkDS读取文件头判断ID是否为xDD若ID不是xDD则直接跳出否则继续。接着就是按照树状块的结构通过while循环从树干、树杈、树枝依次读取需要注意的是读取一个DS文件只能是顺其自然而不能通过特定的块名去寻找块的信息因为并不是所有的块都存在的例如材质块如果在建模时未指定对象材质那么导出的DS文件中就不包含材质块。而所谓顺其自然就是指按照文件指针的顺序依次向下读取当读取到块头时则判断块头的ID是否是三维重建所需要的。这样就不会丢失或遗漏所需要的数据。while(StartPos<FileSizeReadChunk(fp,chunk))判断文件指针能否向下移动{switch(chunkid)块头的ID号{casexdd:判断是否是需要的若是则进入该块……当读取到材质块时则将读取到的信息保存到材质结构体tMaterial中每读完一个材质块就将其添加到材质对象MaterialDict中最终组成材质库。当读取到点块时循环调用读取特定长度的函数从而可将点的信息读取到内存中inlineshortReadShort(FILE*fp,shortvalue)读取两个字节的整型{return(fread(value,sizeof(value),,fp)==)}当点块和材质库读取完毕后其实就是意味着三维重建数据中最重要的部分已读取完毕其他必要的信息都是在材质库和点块的信息基础上来构建通过各自块中对应点块和材质库的索引号获取指定的信息。如果说点块和材质库数据是三维重建最重要的数据部分那么面块则是三维重建最关键的绘制部分。在OpenGL中面是由点构成的对象是由面构成的对象上的颜色、贴图等数据则是由材质库根据对象不同的面选择不同的材质块进行映射选择的依据是面块中保存的材质库中对应材质块的索引号。前面已经提到DS中每个面都是由三个点构成的在面块中保存了每个面对应点块的三个点的索引这些索引指的是基于的按照点在点块中被读取的位置进行标记的。由此可知面块既是连接底层数据的中转块同时也是负责三维绘制的基本单元。读取面块时首先获取总面数通过fread(value,sizeof(value),,fp)将面数读取到value变量中接着根据面数循环读取每个面对应三个点的索引循环结束后将索引加入到object对象中然后读取该面块包含的面对应的材质名称并根据名称到材质库中查找接下来读入该材质映射的面的数量最后将查找得到的材质加入到object对象中并与对应的面进行关联。DS文件数据的保存DS文件数据的保存是通过三个类完成的首先是对象类CSingleObject保存一个对象的所有信息包括坐标点、纹理坐标点、对象本身所用的材质面的信息等等其次是列表类CSingleList可以索引所有的对象也就是说可以通过列表类获取所有已知的信息最后材质库类MatDict用以保存读取的材质块其中包括材质的镜面光成分、散射光成分、对应的纹理贴图名等等其保存的具体文件结构如图。ComputerKnowledgeandTechnology电脑知识与技术多媒体技术及其应用本栏目责任编辑:唐一东第卷第期(年月)一个DS文件对应了一个列表类和一个材质库类一个材质库类包含所有的材质块一个列表类对应的一个或多个对象类而一个对象类包含了该对象所有三维重建所需要的数据信息及对应材质库的索引那么最终只需要通过列表类就可找到所有需要的数据信息。列表类通过调用drawGL(GLuintmdrawModel)函数来循环调用对象类的drawGL(GLuintdrawModel,ReadMapFile*setMatFile)函数所有的数据都已保存在对象类中此时只需在对象类中调用特定的三维画图函数即可实现三维场景的重建。三维场景的实现在MFC框架下调用OpenGL命令进行三维绘制之前需要分别对MFC和OpenGL进行一些必要的初始化工作。MFC框架初始化首先在MFC中进行OpenGL框架的搭建在创建窗口之前在视类的PreCreateWindow函数中添加两个窗口类型csstyle|=WSCLIPCHILDREN|WSCLIPSIBLINGS接着在OnCreate函数中通过PIXELFORMATDESCRIPTOR结构体设置像素对齐格式定义显示设备的特性因为OpenGL和windows图形设置接口GDI的像素对齐格式不同而windows程序中缺省为GDI因此需要为设备选择像素格式然后生成并设置绘制描述表因为OpenGL依赖绘制描述表对硬件进行操作::wglCreateContext(mpDC>GetSafeHdc())::wglMakeCurrent(mpDC>GetSafeHdc(),mhRC)最后在OnDestroy函数中删除调色板和渲染绘制表::wglMakeCurrent(,)::wglDeleteContext(mhRC)OpenGL初始化对OpenGL初始化包括清除窗口、清除深度缓冲区和颜色缓冲区、启动平滑着色模式、启动深度检测、启动光照和光源。::glClearColor(F,F,F,F)::glClearDepth(F)::glClear(GLCOLORBUFFERBIT|GLDEPTHBUFFERBIT)::glShadeModel(GLSMOOTH)::glEnable(GLDEPTHTEST)glEnable(GLLIGHTING)打开光照glEnable(GLLIGHT)启动光源动画绘制为了绘制一帧需要完成三个步骤:由于场景在一个矩形窗口中渲染位于窗口之外的物体或物体的一部分必须剪裁掉::gluPerspective()在OnSize函数中设置投影矩阵接着通过视口变换将变换的坐标与屏幕像素之间建立对应关系glViewport(,,cx,cy)在OnSize函数中设置视口矩阵然后进行模型视图操作::gluLookAt()在绘制场景的函数RenderScene中设置视图模型矩阵其具体流程如图最后绘制物体根据已保存的数据在保存结构最底层的对象类中调用OpenGL绘图命令glBindTexture(GLTEXTURED,textureNames)激活当前贴图glColorf()激活当前材质glBegin(drawModel)用指定的drawModel绘图风格开始绘制glNormalf(nxi,nyi,nzi)设置法线向量glTexCoordf(cufacesj,cvfacesj)设置纹理坐标glVertexf(xfacesj,yfacesj,zfacesj)设置点坐标glTexCoordf(cufacesj,cvfacesj)glVertexf(xfacesj,yfacesj,zfacesj)glTexCoordf(cufacesj,cvfacesj)glVertexf(xfacesj,yfacesj,zfacesj)glEnd()结束绘制动画场景=重绘交换所谓重绘就是快速的刷新每一帧在MFC通过设置定时器实现SetTimer(,,)交换指的是双缓冲区的前后交换即提供两个完整的颜色缓冲区当一个缓冲区显示时另一个缓冲区进行绘图当一帧绘制完成之后则进行交换这样每一帧只有在绘制完成后才会显示从而形成连贯流畅的动画。(下转第页)图存储结构图顶点变换的步骤ComputerKnowledgeandTechnology电脑知识与技术计算机工程应用技术本栏目责任编辑:梁书第卷第期(年月)考试前的状态之后再一键设为不还原状态又可以进行下一批次的考试。)添加安装指定的应用软件。由于课程设置不稳定的原因不可能事先将所有能用到的应用软件都安装好在需要添加安装指定的应用软件时(如卸去Photoshop装上一个DreamweaverMX)在有了网络还原卡后完成这项工作非常简单先在一台计算机上卸去Photoshop然后安装好DreamweaverMX确认运行正常后通过联网广播方式一次将所有计算机安装完毕。还原卡与IPclass多媒体教学的互相应用在机房的管理过程中发现将我校现在使用的多媒体教学软件与还原卡相结合会更大的方便进行机房管理。现在我校为了实现资源利用最大化和不同课程的教学需要都是一台机器装了至少三个操作系统(win,winP,winxp,winS)有的应用软件的安装需要特定的操作系统。在处理这样的需求时采用的是BOOT文件起动法例如在国家一级B等级考试时必须得需要winP操作系统中进行。在bootini文件中的启动项改为winP。然后使用IPCLASS的下发文件功能下发到每一个工作站(在这里如果使用还原大师的下发功能会有一些异常)。重启工作站就会自动进入win操作系统。在考试之前使用IPCLASS的锁定功能锁定工作站会防止考生误动机器。开考时解除锁定考生即可正常操作。每次考完利用还原卡的还原功能恢复到考试环境初始状态。目前还存在的问题与对策在使用还原卡进行机房管理的过程中还存在有一些问题:)还原卡经常莫名被卸载。究其原因有二:一是还原卡与板卡接触松动需要打开机箱把还原卡重新拔插。二是学生的故意破解这样需要老师在上课的过程中监管学生不要使用与课程无关的软件特别是开了INTERNETR的课程。)装了还原卡的机器速度会比不装还原卡时变慢。这是一个不可调和的矛盾由于保护卡的原理决定了会影响一些机器的速度但是这种影响甚微。与使用保护卡的益处相比可以忽略不计。还原卡与主板的兼容性需要进行测试因为有的低档主板的兼容性确实不好会严重影响机器性能。选择品质好的板子可以解决问题。结束语我校机房的网络还原卡使用三年多来机房管理变得更加轻松且每次考试都能顺利进行证明计算机机房使用网络还原卡是一个很好的选择。计算机机房的管理和维护是公认的难题通过对机房管理的学习与探讨采取相应的措施和办法完全可以减轻教师的工作强度提高其工作效率。现针对使用远志还原卡的一些不足和进一步提高管理效率还试采用了长城保护还原卡的措施。参考文献:费雪刚数据备份工具Ghost在机房中的应用J现代企业文化:理论版,()陈清贤高校计算机实验室管理问题与实践J中国现代教育装备,()南京远志资讯科技开发有限公司网络还原大师快速指南Z(上接第页)结束语追求虚拟现实是未来计算机发展的必然趋势三维重建首当其冲。本文就基于VC的三维重建技术进行部分论述针对传统三维建模的不足即虽然模型建设进度较快但缺少人机交互能力提出基于OpenGLMFC框架下结合DS数据的三维重建模式在充分利用三维建模软件的快速建模能力的同时也展现了OpenGL的强大的人机交互能力达到了较好的三维重建效果。参考文献:ShreinerDTheKhronosOpenGLARBWorkingGroupOpenGL编程指南M北京:机械工业出版社,刘欣乐,仇建明dsMax建筑场景效果图表现M北京:北京理工大学出版社,和平鸽工作室OpenGL高级编程与可视化系统开发(系统可视篇)M北京:中国水利水电出版社,和平鸽工作室OpenGL高级编程与可视化系统开发(高级编程篇)M北京:中国水利水电出版社,HearnD,BakerMPComputerGraphicswithOpenGLM北京:电子工业出版社,图实现三维重建

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/4
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部