好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

HOOPS3D可视化入门教程三:基本概念和数据结构.docx

12页
  • 卖家[上传人]:平***
  • 文档编号:14203384
  • 上传时间:2017-10-29
  • 文档格式:DOCX
  • 文档大小:61.94KB
  • / 12 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 慧都控件网 慧都控件网 HOOPS 3D 可视化入门教程三:基本概念和数据结构上篇文章介绍了 HOOPS 的主要模块,这篇文章将要向大家介绍 HOOPS 的数据结构以及穿插其中的一些基本概念这些内容主要包含在 3dGS 模块内一、保留模式HOOPS 采用保留绘图模式(retained mode)所谓保留模式是相对于传统的非保留模式而言的做过 OpenGL 编程的人都知 道,OpenGL 的绘制都是通过调用一系列绘图命令来实现的,通常是在一个叫 updateGL 的函数里除非你自己把相关绘图信息保存起来,否则出了这个 函数 OpenGL 就不认帐了,也就是说你无法从 OpenGL 里面再获取你曾经绘制的一些图元信息而保留模式则不这样,它把绘制过的命令和图形会保存起 来,放在特定的数据结构中,从而使得我们可以事后随时读取这些数据相比于非保留模式,保留模式能够提供更高的效率(因为数据都在内部,下次绘制时不需要 再读取),更快的交互(通过特定的基于数据结构的算法,可以加速选取、高亮等等交互操作),还有更方便的编程接口当然凡事都有两面性,保留模式也有它的 缺点,其中之一就是它增加了程序的内存消耗(用于存储那个数据结构)。

      但我们认为这样的代价是完全值得的二、基于段的数据结构HOOPS 的 数据结构简单讲是基于段(segment)的树状结构最上层是根段,为“/”该数据结构和 Linux 文件系统有着一曲同工之妙,有 Linux 使用经验 的同学将会很容易理解Linux 的根目录的符号也是“/”,所有文件系统中的文件或者文件夹的路径都以该符号开头文件夹有名字,段也有名字如同文件 夹内可以有文件和子文件夹,segment 下可以有 sub segment这样的层次结构可以很好地构建我们想要的图形打开一个段的 HOOPS 函数是 HC_Open_Segment,它有一个参数,就是这个段的名字我们可以传一个空字符串给它,从而创建一个匿名 段如果已经存在这个名字的段,则该函数会打开这个段,否则就自动创建一个新段打开后,我们就可以在该段内做任何我们想要做的操作操作结束,记得用HC_Close_Segment 来关闭这个段HOOPS 采用和 OpenGL 一样的上下文机制,那就是“状态机(State Machine)”所谓状态机,形象地讲就是一旦改变了状态,则接 下去不论程序运行到哪里,该状态将一直保存,直到下次改变状态。

      在 HOOPS 中,打开一个段实际上就意味着进入了一个状态机,直到你关闭这个段,你所有的 操作都将在这样一个上下文中进行具体来讲就是,打开一个段,然后你可以跳转到任意的程序位置完成具体的绘制任务,然后关闭段,这一系列操作没有必要在一 个函数中完成这无疑大大增加了我们编程的灵活性慧都控件网 慧都控件网 举个例子,我们想要绘制一所房子,房子有房顶、窗户还有门,我们可以用如下代码:HC_Open_Segment (“/”);HC_Open_Segment (“house”);HC_Open_Segment (“roof”);HC_Close_Segment ();HC_Open_Segment (“door”);HC_Open_Segment (“windows”);HC_Open_Segment (“window1”);HC_Close_Segment ();HC_Open_Segment (“window2”);HC_Close_Segment ();HC_Open_Segment (“window3”);HC_Close_Segment ();HC_Close_Segment ();HC_Close_Segment ();HC_Close_Segment ();实际上我们创建了如下的树状结构:慧都控件网 慧都控件网 创建了段之后,我们需要有相应的方法能够找到这个段,这时就会用到段的路径。

      和 Linux 上的文件路径类似,段的路径也分为两种:相对路径和绝对路 径我们打开一个段,进入该段的状态机,如果要打开它下面的子段,就可以用相对路径HOOPS 会自动地在该段下面找给出的段名,如果找不到,则会报错 绝对路径则是从根段名“/”开始,逐步地把段名添加上去,直到我们想要找的段为止,完整的路径就是绝对路径例如我们要找第三扇窗户,相对于 house的 相对路径是:”windows/window3”,而绝对路径是:”/house/windows/window3我们可以用“.”和“..”来分别指代当前目录和父目录,这又跟 Linux 上的路径使用习惯是一致的这种简称只能用于相对路径中为了能够更方便地提供段的路径,HOOPS 中还有一套特有的符号,叫做“wildcards”,可以同时指代多个不同的路径,有以下几种:1. 逗号 wildcard这个是最简单的一种有时候我们需要同时对多个可枚举的段进行统一处理,例如我们想用同一种颜色来装饰 roof 和 door(虽然这种做法很少见……),我们就可以用这样的一个路径来同时指代这两个段:/house/(door,roof)2. 通配符可以用“*”来匹配 0 个或多个字符,“%”来匹配单个字符,这个跟我们用 Windows 系统搜索功能是一样的,也和正则表达式相一致。

      3. 递归 wildcards其实上面两个并不是 HOOPS 所独有的,在其他也有见到但是 HOOPS 还有一个它特有的符号,那就是“…”,该符 号可以指代一个段名或者一串路径上的段名例如我们可以用/house/…/window1 来指代第一扇窗户,而不用去管当中到底隔了多少个段该种方法 非常长适合于我们不清楚house 到 window1 之间到底存在着怎样的父子结构虽然方面,但是如果我们确切地知道 window1 的完整路径,那就不要 这么写了,因为 HOOPS 是通过自顶向下的方式搜索得到 window1,所以需要消耗一定的计算量另外,该符号还可以递归地表示一个段的所有子段以及子 段的子段如果我们要对一个段内的所有子段进行某项修改,那么这个 wildcards 真是再合适不过了三、几何信息(Geometry )segment 像文件夹一样,它本身并没有实质的东西,而只是一个容器真正绘制出车的形状,还需要具体的几何信息因此,段内部除了可以存储子段 外,还可以存储 GeometryHOOPS 中的 Geometry 丰富多样,囊括了点、边、面、壳(shell)、网络(mesh)等等基本上大家能够想 到的图元。

      这些基本几何通过相互组合,可以组成更加复杂的图像信息,这是一个自底向上的组建过程例如我们可以通过下面的方式插入一个点和一条直线:HC_Open_Segment (“myseg”);慧都控件网 慧都控件网 HC_Insert_Marker (0, 1, 1);HC_Insert_Line (-1, -1, -1, 2, 2, 2);HC_Close_Segment ();HC_Insert_Marker 需要传入三个浮点参数,也就是一个点的三维坐标HC_Insert_Line 需要传入六个参数,为一个线段的起始点和终止点的三维坐标我们可以用下面的代码插入一个多边形的面:HC_POINT pts[4] = {HC_POINT(0, 0, 0), HC_POINT(1, 0, 0), HC_POINT(1, 1, 0), HC_POINT(0,1, 0)};HC_Open_Segment (“mypolygon”);HC_Insert_Polygon (4, pts);HC_Close_Segment ();HC_Insert_Polygon 需要传入两个参数,分别是多边形顶点个数以及存放顶点三维坐标的数组。

      该函数代表了 HOOPS 中一类参数,就是 对一群点进行操作需要注意的是,这类函数在内部会对传入的三维坐标数组进行拷贝,所以如果你传入的坐标数组是动态申请出来的,在调用完该类函数之后,必 须手动地将其释放掉除了基本的点、线、多边形等,HOOPS 还提供了两个相对高级的图元,分别是Shell 和 Mesh在进行大型场景构建时,这两个图元是非常常用 的,例如我们用三角网格构建一个人的模型,那么这个三角模型就是一个 shellshell 有三个层次的图元组成,分别是 node(点)、edge(边) 和 face(面),这三部分相互连接形成一个整体mesh 和 shell 非常类似,同样由点边面三部分组成,唯一的区别是 mesh 它不能形成一个封闭的类 似于人这样的模型,它只能是一张面,而且只能是一张四边形面,例如一张四边形纸这样的区别使得在处理特定的模型时,如果 mesh 能够满足应用需要,那么 mesh 将会比 shell 表现得高效得多下面举例创建一个立方体,并在它的一个面上接一个金字塔体:HC_POINT pts[] = {HC_POINT (0, 0, 1), HC_POINT (1, 0, 1),HC_POINT (1, 1, 1), HC_POINT (0, 1, 1),慧都控件网 慧都控件网 HC_POINT (0, 0, 2), HC_POINT (1, 0, 2), HC_POINT (1, 1, 2), HC_POINT (0, 1, 2),HC_POINT (0.5, 0.5, 2.5)};int flist[] = {4, 0, 3, 2, 1,4, 0, 1, 5, 4,4, 1, 2, 6, 5,4, 2, 3, 7, 6,4, 3, 0, 4, 7,3, 4, 5, 8,3, 5, 6, 8,3, 6, 7, 8,3, 7, 4, 8};HC_Open_Segment ("mymodel");HC_Insert_Shell (9, pts, 41, flist);HC_Close_Segment ();HC_Insert_Shell 需要四个参数,分别是 shell 的顶点个数,顶点数组,面列表数组的长度,面列表数组指针。

      顶点个数和数组很好理 解,就是具体的各个顶点的三维坐标面列表是这样的格式:面顶点个数 n, 第一个顶点序号,第二个顶点序号,…,第 n 个顶点序号例如 flist 第一 行,4 表示该面由四个顶点构成,也就是一个四边形然后,0,3,2,1 表示由 pts 这个数组中的第0、3、2、1 号点构成这个面需要注意的是 HC_Insert_Shell 的第三个参数实质 flist 这个数组本身的长度,而不是将要构建的 shell 上面的个数例如这个例子中面的个数为 9,但 flist 的长度为 41效果如下图所示:慧都控件网 慧都控件网 四、段的属性上文中,我们在 HOOPS 中创建了一个房子,假设我们现在已经用几何图元将房子给绘制出来了,但是光有结构还不行,至少我们还需要给它上色,或许我 们还会通过贴上不同的纹理来表示不同的材料HOOPS 的段结构中除了可以存放Geometry,还可以存放属性 Attribute我们常用的属性包 括:可见性(Visibility),颜色(Color),可选择性(Selectability),点、边、字体的大小,光照(light),渲染属性 (rendition)等等。

      甚至可以添加我们自定义的属性(User defined attribution)可以说,HOOPS 的属性功能是非常 全面而强大的和插入几何一样,要修改一个 segment 的属性,我们需要进入该 segmen。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.