(交通信息工程及控制专业论文)基于头盔立体显示和位置跟踪的虚拟场景漫游系统.pdf_第1页
(交通信息工程及控制专业论文)基于头盔立体显示和位置跟踪的虚拟场景漫游系统.pdf_第2页
(交通信息工程及控制专业论文)基于头盔立体显示和位置跟踪的虚拟场景漫游系统.pdf_第3页
(交通信息工程及控制专业论文)基于头盔立体显示和位置跟踪的虚拟场景漫游系统.pdf_第4页
(交通信息工程及控制专业论文)基于头盔立体显示和位置跟踪的虚拟场景漫游系统.pdf_第5页
已阅读5页,还剩111页未读 继续免费阅读

(交通信息工程及控制专业论文)基于头盔立体显示和位置跟踪的虚拟场景漫游系统.pdf.pdf 免费下载

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

文档简介

西南交通大学硕士研究生毕业论文第日页 a b s t r a c t t h i s p a p e r d i s c u s s e d t h e d e s i g n a n d i m p l e m e n t a t i o n o f a v r ( v i rt u a l r e a l i ty ) s c e n e n a v i g a t i o n s y s t e m u t i l i z e d h md ( h e a d - m o u n t e d mo n i t o r d e v i c e ) a n d t r a c k e r . t h e s y s t e m i s d e v e lo p e d b y u s i n g v i s u a l c + + 6 a n d o p e n g l a n d c o n s i s t e d o f t w o m a i n m o d u l e s : s c e n e e d i t o r a n d s c e n e n a v i g a t o r . t h i s p a p e r d i s c u s s e d t h e m a i n f u n c t i o n s o f s c e n e e d i t o r : c r e a t i n g s c e n e d a t a f i l e b y i m p o rt i n g d x f ( d r a w i n g e x c h a n g e f o r m a t ) f i l e a n d a s e ( a s c i i s c e n e e x p o rt ) f i l e , b a s i c m o d i f y i n g f u n c t i o n s s u c h a s z o o m a n d r o t a t e , s e l e c t i n g t h e o b j e c t s i n s c e n e , s e tt i n g u p t h e s t a rt in g p o s i t i o n o f u s e r i n s c e n e , e t c . t h i s p a p e r a l s o d i s c u s s e d t h e ma i n f u n c t i o n s o f s c e n e n a v i g a t o r : c r e a t i n g 3 d v i e w b y h md , t r a c k i n g u s e r s p o s i t i o n a n d o r i e n t a t i o n b y t r a c k e r a n d m o d i f y i n g s c e n e b y u s e r s p o s i t i o n a n d o r i e n t a t i o n , i m p l e m e n t i n g c o l l i s i o n d e t e c t i o n a n d t h e c a l c u l a t i o n o f p v s , e t c . f u rt h e r m o r e , t h e p a p e r p r o p o s e d a n e w m e t h o d f o r s c e n e a r r a n g e m e n t : o b j e c t o r i e n t e d o c t r e e s p a c e p a rt i t i o n i n g . o c t r e e c r e a t e d b y t h i s n e w m e t h o d c a n m a i n t a i n c o r r e c t l o g i c r e l a t i o n s h i p o f o b j e c t s i n s c e n e a n d f a c e s o f a n o b j e c t . t h i s t r e e s t r u c t u r e h a s h i g h e f f i c i e n c y a n d s u i t s f o r m a n y k i n d s o f s c e n e . t h e p a p e r t r i e d t o d e s c r i b e t h e r u l e s o f m o v e m e n t a n d a c t i v i ty o f o b j e c t s i n s c e n e , a t t h e e n d o f p a p e r i s t h e a n a l y s i s a n d c o r r e c t io n t h e m i s t a k e s o f t h e m e t h o d o f i n t e r s e c t i o n d e t e c t i o n b e t w e e n l i n e a n d 3 d b o x i n t h e m e t h o d b a s i s o f c o m p u t e r r e a l i s t i c g r a p h i c s . t h e f ir s t c h a p t e r d i s c u s s e d t h e b a s i c c o n c e p t s o f v r . t h e s e c o n d c h a p t e r d i s c u s s e d t h e s y s t e m s d e s i g n i n g g o a l s , h a r d w a r e a n d s o ft w a r e e n v i r o n m e n t , m a i n s t r u c t u r e o f s y s t e m . t h e t h i r d c h a p t e r d i s c u s s e d t h e s y s t e m s s c e n e a r r a n g e m e n t m e t h o d : o b j e c t o r i e n t e d o c t r e e s p a c e p a rt it i o n in g . t h e f o rt h c h a p t e r g a v e a d e t a i l e d d i s c u s s i o n o f s c e n e e d i t o r . t h e f i ft h c h a p t e r d i s c u s s e d s c e n e n a v i g a t o r . a t t h e e n d o f p a p e r p r o v i d e d s o m e e x p l a n a t i o n o f c o n c e p t s a n d m e t h o d s u s e d i n s y s t e m. k e y w o r d s : v r o s p o p e n g l h md t r a c k e r 西南交通大学硕士研究生学位论文第1 页 第1 章 虚拟现实技术概述 虚 拟现实 ( v i rt u a l r e a li t y ) 是 近年来 十分活跃的 技术 研究 领域, 是一系 列高新技术和研究领域的汇集,这些技术包括多媒体技术、人机接口技术、 传感器技术以及高度并行的实时计算技术,还包括人的行为学、计算机图形 学、人工智能等研究领域。虚拟现实是多媒体技术发展的更高境界,是众多 技术和研究领域的更高层次的集成和渗透;它能给用户以更逼真的体验,它 为人们探索宏观和微观世界以及由于种种原因不便于被直接观察的事物的运 动变化规律提供了极大的便利。由于它的诱人前景,一经问世就立即受到了 人们的高度重视。 1 . 1虚拟现实的概念 虚拟现实是一种由计算机和电子技术创造的新环境,是一个看似真实的 模拟环境,通过多种传感设备,用户可根据自身感觉,使用人的自 然机能对 虚拟环境中的物体进行考察或操作,参与其中的事件;同时提供视、听、摸 等直观的实时感知,并使参与者 “ 沉浸”于模拟环境中。尽管该环境并不实 际环绕我们,但它作为一个 “ 逼真”的三维环境,仿佛就在我们周围。从这 里可以看出,虚拟现实的概念包括了以下几个方面: ( 1 ) “ 模拟环境”就是由计算机生成的具有双目 立体视觉、实时动态的 三维逼真图像,模拟环境可以是某一特定现实世界的真实再现,也可以是虚 拟构想的世界。 ( 2 ) “ 感知”是指在理想的虚拟现实环境中能够提供一切人所具有的感 知作用,除了计算机图形技术生成的视觉感知以外,还有听觉、 触觉、 力觉、 运动等感知,甚至还包括嗅觉和味觉等,也称为多感知。 ( 3 ) “ 自 然技能”指的是在虚拟环境中人以自 然动作,如头部转动、眼 球转动、手势或其他人体行为动作,参与对环境的交互,由计算机来处理与 参与者动作相适应的数据,并对用户的输入 手势、口头命令等)作出实时 响应, 并分别反馈到用户, 使用户有身临其境的感觉, , 还可以与在该环境中 的其他参与者交互。 _ _ 一一-一. . . . , .网 , , ,一 , ,州 . . . . .甲 州喇 巨. ., , ,一 - - 朴-. 一一 西南交通大学硕士研究生学位论文 b i n a ry s p a c e p a r t i t i o n i n g ) 算法是一种空间剖分 技术,它充分利用了平面的定侧性质,即空间中的任一平面总是将整个空间 剖分成两部分,一部分位于其正侧,另一部分则位于其负侧。人们根据这一 性质建立起空间二叉树结构。该二叉树的每一结点表示一子空间所在空间及 其包含的多边形。 在每一枝结点空间中, 选取其中一平面将该空间剖分成正、 西南交通大学硕士研究生学位论文第1 0 页 负两子空间,分别作为该结点的两个子结点。每一子空间包含了位于它内部 的多边形,其中与分割平面有交的多边形被分成两个多边形,被分别归入相 应的子空间中。上述过程是一个递归过程,直至处理完场景中的所有平面多 边形为止。显然,该树的根结点代表整个空间,而其每一叶结点即为剖分产 生的互不相交的子空间。 在二叉树剖分中,确定子空间和剖分面的位置关系是非常重要的,但确 定这种位置关系的方法并不唯一,只要在整个算法执行过程中能够无歧义地 确定子空间和剖分面的位置关系即可。这里所说的 “ 平面子空间剖分成正、 负两子空间”利用的是平面的法线,平面法线正方向所指的是正空间,平面 法线负方向所指的是负空间。 图3 - 1 显示了一个三维场景的二叉树剖分。 1 到6 的数码表示了最后剖分 产生的子空间,它们分别对应于二叉树的叶结点。 图3 - l三维场景的二叉树剖分 有关二叉树剖分的详细算法说明可以在与计算机图形学相关的书籍中找 到,这里不详细叙述。 据有关书籍记载,对于大部分场景来说,b s p树较之八叉树更为平衡, 因而, 树的深度也较浅, 具有内存耗费小, 剖分产生的无效区域较少的优点。 但是,习惯上说,二叉树主要被用于处理封闭空间,例如,房屋内部,而八 叉树通常用于处理开放空间,例如,模拟飞机在高空中飞行。这一点可以从 现 在的 计算机 游戏中 看到。 q u a k e , q u a k e 2 , q u a k e 3 , h a l f l i f e 等著名 三维第一视角射击游戏中都使用了二叉树,这些游戏的共同特点是游戏者看 到的景象多数处于房间内部,房间外部的开阔场景极少。对于系统来说,系 统不能将用户浏览的场景限定于房屋内部,而必须即能处理封闭场景也可以 处理开阔场景。因此,系统最终采用了八叉树。系统采用八叉树的另一个原 因是在系统设计时没有找到足够的二叉树的资料。 从下小节开始将详细介绍八叉树的概念及系统采用的改进的八叉树 西南交通大学硕士研究生学位论文第1 1 页 面向对象的八叉树。 3 . 2八叉树 本节开始介绍空间八叉树剖分算法及系统采用的面向对象八叉树。空间 八叉树剖分 ( o s p , o c t r e e s p a c e p a r t i t i o n i n g ) 算法用于在三维环境中 表示几 何对象,是很多建模和渲染系统的基础。o s p的基本目的是减少在场景中进 行光线跟踪、 碰撞检测、 可视面确定等计算时找到需要处理的面的比较次数。 八叉树算法通常用于静态场景,但同样也可以用于动态场景的处理。八叉树 算法可显著减少对场景中多边形进行排序的时间。 3 _ 2 . 1常用的八叉树创建方法 传统的八叉树创建方法是一个空间非均匀网格剖分算法,该算法将含有 整个场景的空间立方体按三个方向的中剖面分割成八个子立方体网格,组织 成一棵八叉树。 如果某一个子立方体网格中所含的景物面数大于给定的阀值, 则对该子立方体网格做进一步剖分。上述剖分过程递归执行直到八叉树种每 一个叶子结点表示的子空间所包含的景物面数小于给定阀值或者每个叶结点 中只包含一个面为止。如图 3 - 2所示,这种方法适合于处理场景中大部分空 间都被几何实体占据,且这些几何实体的尺寸相差不大的情况。从图中我们 可以看到这种方法在剖分空间的时候没有考虑要剖分的空间内有没有几何实 体,当场景中大部分空间没有被几何实体占据时,这种方法必然产生很多空 结点,影响查询速度,浪费存储空间。 口口 口口 西南交通大学硕士研究生学位论文 图3 - 2传统八叉树剖分算法示意图 第1 2 页 另一种八叉树创建方法称为层级边界盒算法,相对于传统的八叉树剖分 算法,该算法具有自下往上的特点,即该算法不是直接从整个场景开始切割 空间,而是从场景中的某个面开始,直到处理完场景中所有的面。该算法如 下: 第一步,首先定义八叉树结点中能够容纳的最大面数f , 然后将整个 场景的边界盒存放在八叉树根结点中,接着在场景中随机挑选面,被选中的 面称为 “ 种子面” , 然后寻找离种子面最近的面, 直到面的数目达到预先定义 的最大面数,将找到的面作为子结点加到八叉树中,在剩下的面中继续执行 上述算法直到所有的面都被处理过,这样得到八叉树的第一层。 第二步, 缩小fx , 通常将该值减半, 然后对每个子结点中的面递归 执 行第一步的算法,即将每个子结点中包含的面作为新的场景生成新的小八叉 树, 并 用新小 八叉 树的 根结 点代替原 来的子结点, 直到f 足够小或者 每个 面都占据自己独立的结点。这种算法适合处理场景中大部分空间都没有被几 何实体占据的情况, 因为这种算法生成的八叉树只记录了场景中有面的空间。 这里我们可以看到层级边界盒算法其实生成一个 n叉树,每个根结点下 可以有任意多个子结点,并不是严格意义上的八叉树。但是,如果将上述算 法的第二步稍作改动即可以得到一种新的八叉树算法,我们将其称为混合八 叉树剖分算法,即将上述算法的第二步改用传统八叉树的构造方法,算法如 下: 先按照层级边界盒算法得到 n叉树的第一层,然后对第一层中的每个子 结点进行传统八叉树算法剖分,即将每个子结点表示的边界盒作为新场景的 边界盒开始剖分。这样得到的八叉树集中了传统八叉树算法和层级边界盒算 法二者的优点。 3 . 2 . 2八叉树用于可见性计算 在讨论八叉树用于可见性计算之前,先讲一下其中要用到的几个概念: 1 .视景体 视景体是一个空间区域,一般为长方体或一个台锥。无论场景多么大, 位于视景体以外的物体最终都将被剪掉,因而不会在屏幕上显示。构成视景 体的6 个面称为剪切面,它们都是相对观察者而言的。其前面面向眼睛,称 一 月 , , , , , , , , , , , 西南交通大学硕士研究生学位论文第1 3 页 为近剪切面,其背面称为远剪切面。 平行投影和透视投影的视景体如图3 - 3 和图3 - 4 所示, 图中t表示上剪切 面,r表示右剪切面,b表示底剪切面,l表示左剪切面。 图3 - 3平行投影的视景体 l ; - t , 产 /户j 砂过 .- 人书 , : 于丫止一i _ - 视点 图3 - 4透视投影的视景体 2 . 3 d d d a算法 3 d d d a ( 3 d d i g it a l d i ff e r e n t i a l a n a l y z e r , 三维 数字 差分 算法) 算法是 从 二维d d a算法推广而来, 与二维d d a算法非常类似, 具体算法可以在图形 学书籍上找到,这里不做详细介绍。 下面开始讨论八叉树用于可见性计算。对于传统八叉树创建算法,场景 空间已被剖分成许多彼此相连的边界盒,因此,我们可以先找到当前视景体 的八个顶点,接着,计算出八个顶点定义的线段,在八又树中遍历直到找到 包含顶点的最小边界盒,接着找出包含近剪切面的四个顶点的边界盒,利用 近剪切面的四个 顶点 及四 个边界 盒, 通过 3 d d d a ( 3 d d i g it a l d i ff e r e n t i a l a n a l y z e r ,三维数字差分算法)算法找到所有与近剪切面相交的边界盒,最 西南交通大学硕士研究生学位论文第1 4 页 后,利用找到的边界盒及剩余的线段和顶点,通过 3 d d d a算法找到所有在 视景体内部及与视景体边界相交的边界盒。这样,我们就完成了利用传统八 叉树剖分算法计算潜在可见集 ( p v s )的工作。由于传统八叉树剖分算法将 整个场景切割成相邻的子空间,3 d d d a算法恰好是利用空间连贯性的快速 算法,因此,在传统八叉树中确定p v s的计算效率很高。 对于层级边界盒八叉树算法,计算潜在可见集 ( p v s )的第一步也是确 定视景体,之后在八叉树的第一层子结点中遍历以确定八叉树中每个分支表 示的边界盒是否与视景体相交,如果相交则对于该分支递归执行算法,判断 子分支表示的边界盒是否与视景体相交,直到到达叶子结点为止。这样即确 定了哪些叶子结点表示的边界盒需要被处理,接下来可以将找到的叶子结点 中包含的面提交给硬件利用 z - b u f f e r 进行处理。层级边界盒算法生成的八叉 树不能利用3 d d d a算法, 而必须遍历八叉树的每个分支, 当八叉树较大时, 显然效率不高。 至于混合八叉树剖分算法,计算p v s的第一步也是得到视景体,之后采 用于层级边界盒算法相同的算法确定八叉树中的哪些分支与视景体相交。找 到与视景体相交的八叉树分支后,即可利用 3 d d d a算法找出所有与视景体 相交的子边界盒,这样也就确定了p v s .混合八叉树即不需要记录没有几何 实体的空间,又可以使用3 d d d a算法快速确定p v s ,是一种较好的算法。 3 . 3面向对象的八叉树 从3 .2 节对常见八叉树算法的讨论中可以看出不管是传统的八叉树算法、 层级边界盒算法或者是混合八叉树算法,都割裂了场景中几何实体内部的逻 辑关系。其原因在于这些算法都基于场景中的面剖分空间,而没有考虑面与 面之间的逻辑联系,也即这些算法有可能将属于多个几何实体的面划分在同 一个子空间内,如图3 - 5 和3 - 6 所示。 西南交通大学硕士研究生学位论文第1 9 页 第4 章 场景编辑器关键技术 场景编辑器是系统中用于生成和编辑三维场景的模块。该模块读入由其 他现有商业建模软件 ( 3 d s ma x . a u t o c a d等)生成的场景文件,利用其 他建模软件中建立好的模型生成用于场景漫游的虚拟场景,需要完成的工作 包括确定浏览主体的视点,确定场景中的运动物体,确定运动物体的运动规 律,确定交互细节,加入特殊处理效果,如动态纹理、动态雾化、动态灯光 等,最后将建立好的场景按系统自定义格式输出为虚拟场景数据文件 ( s e n 文件) 。 现阶段场景编辑器可以接受的文件格式包括d x f 文件( 可由a u t o c a d 或3 d s ma x生成) 和a s e文件 ( 由3 d s ma x生成) , 其中a s e文件格式是 3 d s ma x独有的文件格式,没有公开正式的 a s e文件格式说明文件,本系 统在参考 i n t e rn e t 上的共享资源的基础上实现了a s e文件的转换。 4 . 1使用其他建模工具生成的模型文件 o p e n g l 为程序员提供了 强大的 二维及三维图形功能, 这些功能包括: 建 模、变换、光照、色彩、明暗处理、运动、纹理、材质处理以及帧缓存等等。 在 o p e n g g l提供的所有功能中,以实时渲染功能最为突出,因此与其说 o p e n g l是建模工具, 不如说它是一种渲染工具。而很多 c a d软件就使用 o p e n g l函数进行渲染。 但是, 作为 底层图 形库, o p e n g l本身没有提供对其他建模工具或c a d 软件生成的模型数据文件的支持。这样一来,对于复杂的图形应用程序,尤 其是可视化仿真及演示系统等应用,程序员就不得不花费大量时间,逐条语 句地完成建模工作。对于本系统来说,逐条语句地完成建模工作是不可接受 的, 而且, 独立根据o p e n g l 函数开发出 完善的建模工具所需要耗费的人力、 物力也是不可接受的。 另一方面, 利用现有的商业建模软件如a u t o c a d和 3 d s m a x生成复杂物体的模型非常简单, 如果能在系统中直接调用这些数据 文件,不仅能极大地降低系统开发周期和成本,更重要的是还可以提高系统 的可扩充性能,因此,场景编辑器采用先读入a u t o c a d和3 d s m a x生成 的模型文件,再在其基础上加入场景漫游及交互所需信息的方法生成虚拟场 西南交通大学硕士研究生学位论文第2 0 页 景数据文件。 本节将全面介绍系统中接受的两种模型文件:d x f和 a s e文件, d x f文件特定为a u t o c a d r 1 4 生成的d x f文件或 3 d s ma x 3 导出的 其中 r1 4 版 d x f文件,a s e文件由3 d s ma x 3 导出。 4 . 1 . 1 d x 文件格式及其转换 本节对 d x f文件格式及在系统中调用 d x f文件作详细分析。 4 . 1 . 1 . 1 d x 文件的基本结构 d x f ( d r a w in g e x c h a n g e f o r m a t )即 图形 交换 文件, 是一 种顺 序文件, 它是在一定的组代码符号规定下,包括了实体命令和几何数据信息在内的数 据文件。d x f文件包含 a u t o c a d 图形的完整信息。d x f文件既可以是 a s c i i 格式也可以是二进制文件格式,因为a s c i i 格式比二进制文件格式更 常见, 所以 在本文中用术语 “ d x f 文件” 表示a s c i i d x f文件, 用术语 “ 二 进制d x f文件”表示二进制文件。 d x f 文件完整的组织结构说明如下: 标题段( h e a d e r ) : 此段包含图形的基本信息, 它由一个 a u t o c a d 数 据库版本号和许多系统变量组成。每个参数包括一个变量名及其组值。系统 忽略该段中的信息。 类段 c l a s s e s ) : 此段包含有关应用程序定义类的信息, 这些类的实 例包含在 b l o c k s段、e n t i t i e s段和 o b j e c t s段的数据库中。类定义 在类的层次结构中是固定不变的。系统忽略该段中的信息。 表段 t a b l e s ) :此段包含如下符号表的定义: a p p i d( 应用程序标识表) b l o c k r e c o r d( 块引用表) d i m s t y l e( 标注样式表) l a y e r( 图层表) l t y p e( 线型表) s t y l e( 文本样式表) u c s( 用户坐标系表) 西南交通大学硕士研究生学位论文第2 1 页 v i e w ( 视图表) v p o r t( 视口配置表) 系统忽略该段中的信息。 块段 ( b l o c k s ) :此段包括块定义和组成图形中每个块引用的图形图 元。系统忽略该段中的信息。 实体段 ( e n t i t i e s ) :此段包含图形中的图形对象 ( 图元) ,包括块引 用 ( 插入图元) 。系统处理该段中的信息。 对象段 ( o b j e c t s ) : 此段包含图形中的非图形对象, 所有非符号表记 录的、符号表的和非图元的对象都储存在此区域中。在 o b j e c t s段中的条 目 样例是包含多线和组的字典。系统忽律该段中的信息。 d x f文件的总体结构如下: 0 s e ct i on 2 he ader 标题段开始 标题段内容 0 e nds e c 0 s e c t i on 2 clas s es 标题段结束 类段开始 类段内容 0 e nds e c 0 类段结束 s e c ti on 2表段开始 tables 表段内容 0 ends ec表段结束 西南交通大学硕士研究生学位论文第2 2 页 一一一 0 s e c t i on 2 块段开始 b l oc ks 块段内容 0 e n d s e c块段结束 0 s e c t i on 2实体段开始 e nt i t i e s 实体段内容 0 e n d s e c实体段结束 0 s e c t i on 2对象段开始 ob j e ct s 对象段内容 0 e n d s e c对象段结束 0 e o f文件结束 在d x f文件中,每两行构成一组。每组中的第一行为组代码,第二行为 组值。例如,d x f中每个段都从相同的两行开始: 0 s e c t i on 这两行中第一行为组代码0 ,第二行是组值 s e c t i o n ,表示下面将开始 一个段,至于是哪种段,则由紧跟其后的两行指定,例如: 2 e nt i t i e s 这两行中第一行为组代码2 ,第二行为组值e n t i t i e s ,表示这个段的类 西南交通大学硕士研究生学位论文第2 3 页 型是e n t i t i e s( 实体)段。当段终了时,也由相同的两行结束: 0 e nds e c 这两行中第一行为组代码 0 ,第二行为组值 e n d s e c ,表示当前段结束 而不管当前段的类型。 文件最后由如下两行结束: 0 e of 这两行中的第一行为组代码0 , 第二行为组值e o f , 表示d x f文件结束。 d x f文件中的组代码是一个不超过3 位数的正整数,组值的类型由组代 码决定。下面是常用的组代码的含义。 . 0 :标识一个事物的开始,如一个段、一个表、一个块、一个图层或一 个实体等。 1 :字符型数据的值,如文本字符串、文件名等。 2 :一个事物的名字,如段、表、块、线型或视图等。 3 -5 :字符型数据的值。 . 6 :线型名 固定的) 。 7 :字型名 固定的) 。 . 8 :图层名 ( 固定的) 。 9 :标题变量名 ( 固定的) 。 1 0. 1 8 : x坐标值。 . 2 0 -2 8 : y坐标值。 . 3 0 3 7 : z坐标值。 3 8 :基面高。 . 3 9 :厚度。 - 4 0 -4 8 :高度、宽度、半径、距离和比例因子等。 - 4 9 :重复的值,如线型表中定义为线型的各短划线长度。 . 5 0- 5 8 :角度值。 - 6 2 :颜色值 ( 固定的) 。 6 6 : 实体跟随标记, 用于折线( p l i n e ) 或带有属性的插入体( i n s e r t ) . 7 0 :标题变量的状态、表的数量和标记等。 7 1 :定义字型时的对称方式和统计数量。 西南交通大学硕士研究生学位论文第2 4 页 7 2 :文本或线型的对齐方式和统计数量。 7 3 :对统计量。 2 1 0 : z , y和 z空间。 9 9 9 :解释行。 实体的坐标与相应的组代码 1 0 1 8 , 2 0 2 8 , 3 0 3 7的用法是:根据实 体所用到的点的数量, 按组代码的个位的0 , 1 , 2 . . . 的顺序使用, 如3 d l i n e 需要两个点,所用的组代码是 1 0 , 2 0 , 3 0 和 1 1 , 2 1 , 3 1 0 3 d f a c e需要4 个点,所用的组代码是 1 0 , 2 0 , 3 0 , 1 1 , 2 1 , 3 1 , 1 2 , 2 2 , 3 2和 1 3 , 2 3 , 3 3. 4 . 1 . 1 . 2实体段分析 1 .实体段结构 系统使用d x f 文件的目的只是要读取其中的三维图形几何信息及属性数 据。 在d x f文件中, 这些信息都包含在d x f文件的实体段( e n t i t i e s ) 中。 因此,我们在设计接口程序的时候,也只需要读取e n t i t i e s段中的数据。 下面将详细讲解e n t i t i e s 段中的具体数据结构。 实体段记录了每个实体的名称,所在图层的名字,线型名,颜色,基面 高度和厚度,以及有关的几何数据。实体段的格式如下: 0 s e ct i o n 2 e nt i t i e s 0 x x x x( 实体名,如 l i n e ) 8( 图层名) x x( 例如,a b) 6( 线型名) x x x x( 如d a s h e d等) 6 2( 颜色号) x( 如,3 ) 3 8( 基面高度) 西南交通大学硕士研究生学位论文第2 5 页 xx. x 3 9 xx. x ( 厚度) ( 该实体的几何数据) x x x x ( 又一实体开始) 0 e n d s e c( 实体段结束) 2 .实体类型及其数据结构 实体( e n t i t y ) 是a u t o c a d 中定义的各种实体类型。 夫 今1 预先定义的图元。 表 4 - 1 列出了在 a u t o c a d 实体类型及其意义 实体类型名意义 p oi nt点 l i ne直线 c i r c l e圆 arc 圆弧 trace 轨迹 s ol i d 实体 te xt 文本 s hap e形 3 dl i ne 三维直线 3 df ac e三维表面 p ol ylin e多段线 ve rtex顶点 下面,我们列出一些常用的实体在 d x f文件的实体段 ( e n t i t i e s )中 的数据结构,后面的文字说明为该实体的空间几何数据描述。 ( 1 )p o i n t( 点) 0开始 p oi nt 8 ah 1 0 x坐标 西南交通大学硕士研究生学位论文第2 6 页 6 . 0 2 0 y坐标 4 . 0 3 0 z坐标 5 . 0 ( 2 ) c i r c l e( 圆) 0开始 c i rc l e 8 a2 1 0圆心x坐标 2 . 5 2 0圆心y坐标 5 . 0 4 0半径 2 . 0 ( 3 ) a r c ( 圆弧) 0开始 arc 8 a3 1 0圆心x坐标 8 . 0 2 0圆心 y坐标 7 . 0 4 0圆弧半径 3 . 0 5 0圆弧起始角度 1 5 . 0 5 1圆弧终止角度 6 0 . 0 关于其他的一些实体类型及数据结构,请参考相应书籍。 西南交通大学硕士研究生学位论文第2 7 页 至此, 我们己经讨论了d x f 文件的基本组成及实体段的数据结构。 在此 基础上,我们就可以着手编制程序,在系统中调用d x f文件了。 在编写接口程序之前, 注意到系统调用d x f文件的目的是要取出文件中 的几何实体的三维几何信息,而在上面的描述当中,可以看到 d x f文件的 e n t i t i e s段中不仅包含三维几何信息,还包括很多二维信息和附属信息。 这些信息对于系统是无用的,不需要进行处理,因此应当先分析 e n t i t i e s 段中哪些信息需要处理,哪些信息不需要处理。经过分析,发现在 由 a u t o c a d r 1 4 和3 d s m a x 3 生成的d x f 文件中,涉及三维几何信息的实 体只有p o l y l i n e和v e r t e x这两种。因此,在编写d x f接口程序时也只 需要对这两种实体进行处理。 4 . 1 . 1 . 3 d x 接口程序的编写 本节将扼要介绍d x f 接口程序的基本结构和主要函数模块。 前面已经提到d x f文件中每两行为一组,因此我们可以先打开d x f文 件 ( 用m f c中c f i l e 类成员函数或c运行时间库中的函数f o p e n 都可以) , 然后依次顺序读取d x f 文件中的两行, 查看其组代码和组值, 直到找到实体 段为止,接着再依次顺序读取 d x f文件中的两行,直到找到需要处理的 p o l y l i n e或v e r t e x实体, 将其中的几何数据读入系统自身的几何数据存 储区内, 接着, 按照系统自定义格式将读入的几何数据转储为系统数据文件。 下面详细介绍 d x f 接口程序的各个部分。 d x f 接口程序被封装在类 c d x f f o g l中,类定义如下: c l a s s c d x f t o g l :p u b l i c c o b j e c t 【 p r i v a t e: i n t d t g e r r o r ; c w n d * m p w n d ; c h a r m l i n e b u f l 工 n e b u f f e r s 工 z e ;/ / 行缓冲区 t ntm g c o d e ; / / 当前读入的组码 p r o t e c t e d: v o i d n o r m a l i z e ( d o u b l e * d n o r m a l ) ; / / 向量归一化 _一一 , 网 . 网 . , , , , 网 , 月 , , . 西南交通大学硕士研究生学位论文第 :. 页 v o i d c a l c u l a t e n o r m a l( c p t r l i s t v o i d c a l c u l a t e f a c e n o r m a l( f l o a t * d v e r t e x l ,f l o a t * d v e r t e x l, f l o a t * d v e r t e x 3 ,d o u b l e * d n o r m a l ) ; b o o l g e t l i n e ( f i l e * f p ) ; / / 按组从d x f 文件中 读取数据 b o o l a d d n e w p o l y l 主 n e ( f 工 l e * f p , c p t r l 土 s t / / 转 换 p o l y l i n e实体 b o o l c o n v e r t e n t i t i e s ( f i l e * f p , c p t r l i s t b o o t,f 主 n d e n t 主 t 立 e s ( f 工 l e * f p ) ; / / 找到e n t 工 t i e s 段 p u b l i c : v o i d s e t p a r e n t( c w n d * p w n d ) ; v o i d c a l c ul a t e b r o u n d b o x( c p t r l i s t c p r o c e s s h i n t * h i n t ) ; 类 c d x f i o g l工作流程如图4 - 1 所示。 西南交通大学硕士研究生学位论文第2 , 页 是否到达文件 a d d n e v p o l y l i n e ( ) 读 比 p o l y l 工 征实体中存 储的信息, 存入系 统 几何数据存储区 退出d x f 文件 转换程序 图4 - 1类c d x f f o g l 工作流程图 类c d x fo g l的成员函数中除了读取d x f文件所需的函数之外, 还包括 一些附加的处理函数,如计算每个顶点的法线向量、每个几何实体的边界盒 等等, 这些函数不在这里讨论。 下面着重说明读取d x f文件相关的函数, 函 数实现用伪代码形式给出,完整代码请参看论文附录。 1 . c d x f t o g l : : g e t l i n e ) 函数定义如下: b o o l c d x f t o g l: : g e t l i n e( f i l e * f p ) 从 d x f文件中读取一行 s s c a n f ( m - l i n e b u f , , % 3 d , / / 组 代码 从d x f 文件中读取一行并存放在m l i n e b u f 中/ / 组值 函数 g e t l in e ( ) 按组从 d x f文件读取数据,即每次调用一次该函数就从 d x f文件中读取两行数据,第一行为组代码,存储在 m - g c o d e中,第二行 为 组 值, 存储在m l i n e b u f 中。 西南交通大学硕士研究生学位论文 第3 0 页 2 . c d x f t o g l : 函数定义如下 b ool cd xf t ogl w h i l e ( 1 ) : f i n d e n t i t i e s ( ) : : f i n d e n t i t i e s ( f i l e * f p ) 是否到文件尾 读取组代码和组值 i f ( m g c o d e = = 0 ) 是否到文件尾 i f( ! s t r c m p( m l i n e b u f , s e c t i o n ) ) 读取组代码和组值 如果找到 e n t 工 t 工 e s 段,返回 return t r ue; 该函数从 d x f文件中找出 ( e n t i t i e s ) 段。如果找到,函数返回时, d x f文件的文件指针位于组值 “ e n t i t i e s ”之后。 3 . c d x f t o g l : : a d d n e w p o l y l i n e ( ) 函数定义如下: b o o l c d x f t o g l : : a d d n e w p o l y l i n e( f 工 l e* f p , c p t r l i s t c ase dxf p ol yli ne p oi nt num : 读入实体顶点个数 b r e a k; case dxf polyli ne f ace num: 读入实体面个数 b r e a k; case 0: 判断是否是v e r t e x段,如果是,跳出当前循环 b r e a k; case dxf color: 读入实体颜色 b r e a k; 读入 ( 实体顶点个数+实体面数)个v e r t e x段,取出其中的顶点信息 和面信息 将新读入的p o l y l 工 n e 实体加到实体列表。 b j l 土 s t 中 r e 七 u r n t r u e; 该函数从d x f文件中读取一个p o l y l i n e实体及其附属的v e r t e x实 体。在 d x f文件中每个三维几何实体都由一个 p o l y l i n e实体及若干个 v e r t e x实体组成。p o l y l i n e实体中记录了几何实体的名称、顶点个数、 面数及颜色等信息,p o l y l i n e后跟 n( 顶点数)+m ( 面数)个 v e r t e x 实体,前n 个v e r t e x实体记录p o l y l i n e表示的几何实体的顶点坐标, 后m个v e r t e x实体记录几何实体的三角面片的顶点索引,存储结构如下 所示: p ol yl i ne 8 b o x 0 1 / 实体名 6 6 西南交通大学硕士研究生学位论文第3 2 页 8 1 1 顶点数 7 2 1 2 1 1 面数,该实体是一个长方体,每个面由两个三角面片构成,共 有6 x 2 个三角面 6 2 1 9 1/ 颜色,d x f文件中实体的颜色由索引值

温馨提示

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

评论

0/150

提交评论