APP下载

基于WPF的STL可视化系统

2019-11-06陈军任王艳红

微处理机 2019年5期
关键词:面片顶点储存

陈军任,王艳红

(1.沈阳工业大学信息科学与工程学院,沈阳 110870;2.沈阳工业大学管理学院,沈阳 110870)

1 引 言

随着科技发展,人们对加工速度以及加工质量有了更高的要求,STL 的可视化技术在应用中占据了很大的比重。STL 的可视化技术就是将3D 扫描的STL 文件快速转化为可视化的三维模型,便利于人们对其进行人机交互等操作,提高加工速率及精确度。研究者对于STL 的可视化进行了大量的研究,占志敏[1]等结合OpenGL 图形编程技术,成功实现STL 三维模型的可视化,其算法简单,只是经过简单的冗余处理及拓扑关系。郑毅[2]使用C++标准模板库和迭代器技术进行编程,借助红黑树结构,加快了拓扑重建任务,但没有实现三维显示及人机交互。邹学涌[3]等采用基于哈希表的拓扑重建算法,并借助了OpenGL 显示技术,实现显示效果及信息获取,该算法中哈希函数的设定对算法效率影响较大,设置不当会使效率大幅降低。尚旭明[4]利用WPF 及XAML技术实现了对3ds Max 模型的显示及简单人机交互。Tata[5]等人提出了一种自适应分层算法,可以根据局部几何形状改变层厚,算法基于三个基本概念:选择适应曲面复杂性的准则、识别对象的关键特征和物体特征,以及开发用于表示对象的facet 的分组方法。Choi[6]等人提出了一种用于分层制造的切片轮廓处理的容错切片算法,该算法旨在克服计算机内存的限制和传统切片方法所固有的计算不稳定性。Brown[7]等人运用切片算法实现了能够处理和切割一个或多个STL 文件。

在此,针对上述研究成果的不足及可行之处,并结合某机械加工企业的实际需求,提出一种基于WPF 的STL 系统可视化设计方案,通过建立WPF模型数据,对直接导入的STL 文件模型进行转化,对模型顶点、边、以及三角片面进行拓扑关系建立,生成三维模型,从而确定模型特征,在此基础上,利用WPF 的3D 显示模块将三维模型显示出来,进而实现STL 文件对应模型的旋转、缩放、平移等人机交互功能。

2 系统整体结构

系统主要由STL 文件分析处理、算法研究实现、人机交互三个主要功能组成。

1)STL 文件分析处理

研究STL 文件格式,分析不同格式间的共同性,对STL 文件进行结构分析,探究其更合适的拓扑关系。

2)算法研究实现

针对对STL 文件的分析,设计STL 文件的读取储存方式,给出STL 文件可视化实现算法流程图。

3)人机交互功能设计及实现

首先利用WPF 的3D 模块搭建可显示3D 效果的场景,然后利用给出的算法处理STL 文件,在3D场景中显示,最后针对可视化的模型进行可操作化设计。

系统整体结构图如图1所示。

图1 系统整体结构图

3 STL文件分析与处理

STL 格式文件以三角形面为单位记录了每个三角形的简单几何信息,每个三角形面都包含该三角形所在平面的法向矢量以及三角形的三个顶点坐标。目前为止,STL 文件有文本(ASCII)和二进制(BINARY)两种格式[8]。

3.1 STL文件的文本格式

ASCII 格式的STL 文件逐行给出三角形面片的几何信息,每一行由1 个或2 个关键字开头。在STL文件中一个带矢量方向的三角形面片是由三角形面片的信息单元facet 来表述的,每一个facet 由7 行数据组成。

关键字facet normal 后面给出三个数是三角面指向实体外部的法向矢量坐标;

outer loop 随后的3 行数据分别是三角面的3个顶点坐标;

end loop 表示完成三角形面片的3 个顶点坐标定义;

end facet 表示完成一个三角形面片定义;

end solid 表示整个STL 文件定义结束,由若干个三角形面片的信息单元facet 构成整个STL 文件格式模型,3 个顶点沿指向实体外部的法矢方向逆时针排列。

3.2 STL文件的二进制格式

二进制STL 文件用固定的字节数来给出三角面片的几何信息。

文件起始的80 个字节是文件头,用于存贮文件名,紧接着用4 个字节的整数来描述模型的三角面片总数,后面逐个给出每个三角面片的几何信息。每个三角形面片占用固定的50 个字节,依次是:

3 个4 字节浮点数,表示三角面法矢量;

3 个4 字节浮点数,表示三角面片第一个顶点坐标;

3 个4 字节浮点数,表示三角面片第二个顶点坐标;

3 个4 字节浮点数,表示三角面片第三个顶点坐标;

最后2 个字节为预留字,一般表示属性特征。

一个完整的二进制STL 文件的大小为三角面的个数乘以50 再加上84 个字节。

3.3 STL文件结构分析

其实不管何种的格式的STL 文件,一个基本的三角片中,都包括了三角片的法向量normal 以及三个顶点的三维坐标vertex 等信息。凭借这些信息都可以唯一确定一个三角片,进而确定完整的三维曲面模型。为更好分析STL 文件结构,以下给出部分STL 文件结构图,如图2所示。

图2 STL 文件局部结构示意图

根据图2所示,假设顶点所对应的边以及边的两个相邻的边为邻接边,那么在三角形ABC 中,点A 的邻接边是a,边a 在该三角形中的邻接边分别为边b 和边c。但是这只是一个三角形的顶点以及邻接边信息,STL 文件所表示的是n 个三角片的信息,其中会有很多相同的顶点以及邻接边。经过观察可以得到一个顶点最多可以达到6 个邻接边,最少有4 个。而边的邻接边最多可以有4 个邻接边,最少2 个。由此可见,若只是简单地减少冗余量提升打开文件的速度,直接处理点的冗余就可以实现,但是如果要进行后续的操作,边的信息也是非常重要的一部分,例如后续在线建模和NC 代码自动生成等。故此不能只处理点的冗余,也须处理边的冗余,然后建立点与邻接边、边与邻接边的拓扑关系。

4 算法研究实现

储存STL 文件信息时,并不能简单地储存点、边以及三角片的信息,还需要储存它们各自的邻接边信息。通过研究还可发现,虽然每三个顶点可以确定唯一的三角片,但是不同的三角片有可能用到相同的顶点以及相同的邻接边,这样就极大地浪费了储存空间以及处理速度。所以为了存取方便,避免点和边的重复存取,设计给每个点和边一个专用的ID号,依据读取的顺序,设计点和边的ID 号从0 开始依次递增。这样就便于在存取的过程中同时也可以剔除重复的顶点和边信息,进而能够大幅度提高存取效率,节省储存空间及读取时间。

为此,需要建立三个容器分别来储存顶点、边和三角片的数据集合。三维顶点的属性包含顶点的三维坐标,以及顶点的邻接边和顶点的专用ID;边的属性包含边的位置信息(两个顶点)、边的邻接边的序号的集合以及边的ID 号;三角片容器属性包含三角形的顶点、边和法矢量信息。容器结构示意图如图3所示。

图3 容器结构示意图

凭借顶点和边的邻接关系,完全可以确定网格模型各三角面片之间的连接关系。由一个顶点出发,可根据其邻接边获取包含该顶点的所有三角形;由产生的邻接边,可分别获取它们自身的邻接边组合。如此循环扩展,直到扩展到整个网格模型为止。然后把STL 文件中的三角片的法矢量信息储存到建立的三角片容器中,这样由以上三个容器的建立就可以获取STL 文件中的所有信息并建立起基本图元之间的邻接关系。简易的演示过程如图4所示。

图4 三角片拓展关系演示图

参考图2的设定,具体算法流程可如图5所示。

图5 STL 可视化算法流程图

如图,假设先读取三角片ABC,首先读取三角片三个顶点的信息,然后按照上述建立的邻接边关系,分别将三角片ABC 的顶点信息储存到顶点容器中,设置点信息ID 号以及点对应的邻接边ID 号;然后把边的信息储存到边容器中,设置边信息ID 号以及边所对应的邻接边ID 号;最后在三角片容器中储存三角片三个顶点ID 以及法矢量信息。接下来读取三角片BDC,首先判断三角片BDC 的三个顶点以及边是否被处理(判断依据是用顶点的三维坐标值与已储存在容器中的三维坐标值相比较),若被处理,将不再处理此信息不同的保留作为下一个处理顶点,然后将欲处理的点边信息分别储存到对应的容器中,且添加邻接边关系。往后的三角片按照上述方法处理,直到达到文件的末尾位置为止。

5 可视化模型操作设计

对可视化模型进行操作化设计,可直观地看出所打开的STL 文件是否有缺陷,并为实现后续在线建模提供操作基础。目前大多数研究者利用C++语言跟OpenGL 或者3ds Max 结合实现3D 模型显示功能,但此方法实际操作性复杂。在此利用XAML技术WPF 框架来实现系统3D 模型显示功能。XAML 技术提供了一种便于扩展和定位的语法来定义与程序逻辑相分离的用户界面,XAML 中界面表现和逻辑功能的分离使得界面开发和功能开发代码分离,有利于开发团队的合理分工,提高了开发效率。WPF 技术主要是用来实现3D 效果,使用WPF实现3D 显示只需要设置好3D 场景,然后将需要打开的STL 文件经过算法处理就可以直接显示。利用C#语言除了因为其与WPF 可以组合实现外,还可以避免C++语言中存在的bug。

5.1 3D环境搭建与可视化实现

3D 环境搭建首先需要在XAML 板块中编写一个Viewport3D 模块,用来显示打开处理的STL 文件,然后在后台程序当中初始化显示3D 模型的必要元素:摄像机(Camera)、光源(Light)、模型(Model)。

设置好这些3D 环境所需要的固定属性,就可以去处理STL 文件来显示STL 文件里面所储存的3D 模型。主要步骤如下:

1)在编写的系统3D 模块中加入3DTools 工具;

2)建立世界坐标;

3)利用上文算法处理STL 文件:

①构建顶点容器,储存顶点的三维坐标x、y、z,以及顶点的邻接边和顶点的专用ID;

②构建邻接边容器,储存边的位置信息(两个顶点)、边的邻接边的序号的集合以及边的ID 号;

③构建三角片容器,储存三角形的顶点、边和法矢量信息;

④利用邻接边信息进行三维模型拓展;

⑤定义表面材质(设置Material 属性);

最终,通过调用处理后的STL 文件,就可在系统中的3D 显示区域实现STL 模型的可视化。可视化效果展示如图6所示。

图6 STL 文件可视化展示图

5.2 操作功能设计

主要设计旋转、缩放、平移等三大功能。这些可通过操作模型的变化来实现,也可通过操作Camera来实现。操作模型时需要变化模型的全部坐标以及更新,而操作Camera 时只需要变化Camera 的坐标信息,故实现三大功能全部用操作Camera 来实现。

当操作Camera 时,首先需要获得Camera 的初始位置以及模型的中心位置,然后需要设置每个功能的计算公式以及获取的变化变量,这样就可以得到新的Camera 坐标位置,以此实现操作功能。

1)模型中心位置获取

在WPF 的MeshGeometry3D 中,有一个 Bounds属性,该属性的功能是返回MesheGeometry3D 的边界Rect3D。Rect3D 表示一个三维矩形,也就是模型的外切矩形。由此信息可以得到外切矩形的三条边长分别为SizeX、SizeY、SizeZ,并且可以得到模型的中心位置(SizeX,SizeY,SizeZ),同时可以计算外切圆半径,计算公式为:

通过初始设置时可以得到Camera 最初的坐标位置为(x0,y0,z0),这样可以得到Camera 到模型中心距离为a,其计算公式为:

2)旋转功能设计

旋转功能除了中心位置的获取,还需要旋转半径及旋转角度。旋转角度可通过鼠标的控制来获取。旋转半径首先比较a 与r 的大小,当a 大于r 时选取a 为旋转半径,否则选r。此举主要是为防止Camera 旋转时进入模型内部出错。

3)缩放功能设计

采取向量比例的算法来实现模型缩放功能,根据鼠标转轮采集的缩放信息进行缩放。设缩放大小为d,缩放后新的Camera 位置可如下式计算得到:

4)平移功能设计

通过计算模型中心位置与期望移动位置的偏差,来确定新的Camera 位置坐标,实现模型的平移功能。

5.3 系统测试

为测试上述构建的方法及所开发系统的有效性,选用某企业实际加工中的一些STL 文件,分别对期文本和二进制两种格式的STL 文件进行测试。结果表明,系统实现了两种STL 格式的可视化,并且可以通过人机交互实现模型的旋转、缩放、平移。系统操作简单、反应速度快。具体测试效果如图7。

图7 实际测试效果展示图

6 结 束 语

采用WPF 框架以及XAML 技术的设计方案,优化了系统实现的简约性,实现了对STL 文件的可视化,也实现了对可视化STL 文件进行操作的功能。用邻接边作为STL 文件快速拓展的依据,极大减少了STL 信息的冗余量,提高了可视化速度,为后续研究中进一步处理可视化的STL 模型提供了信息基础。

猜你喜欢

面片顶点储存
过非等腰锐角三角形顶点和垂心的圆的性质及应用(下)
过非等腰锐角三角形顶点和垂心的圆的性质及应用(上)
冬季养羊这样储存草料
危险物品储存和运输安全
松鼠怎样储存食物
河沿面片
河沿面片
甜面片里的人生
青海尕面片
数学问答