一种物体仿真建模过程研究

2019-05-30 06:16杜丽美
关键词:三角网细分物体

杜丽美

(长治学院 计算机系,山西 长治 046011)

0 引言

在互联网+时代,越来越多的人在生活中要使用网络,人类通过互联网可以获取到各种知识信息,同样人们也想将日常生活中的一些重要信息传到互联网上,以便能够更好地保存或者供他人分享.本文主要研究如何将现实生活中的物体经过建模保存到计算机中,目的是使更多的人可以通过计算机屏幕看到与实物完全一样的虚拟物体以及物体的各种属性.

1 物体表面数据点的获取

通过激光扫描技术、红外线探测技术等可以很方便、准确地获取到物体表面的离散数据点坐标,由于是现实生活中的物体,所以获取到的三维数据点均为三维坐标[1-2],有三个分量X,Y和Z,考虑到物体体积大小不一,要想将不同物体均在同一窗口的中心位置处仿真出来,还需要对每个三维坐标进行一定比例的缩放,具体可以采用如下公式进行:

(1)

公式(1)中的Lx,Wy和Hz分别表示物体在X轴方向上的最大长度、Y轴方向上的最大宽度和Z轴方向上的最大高度,接着找到物体的中心位置Cx,Cy和Cz如公式(2),最后按一定比例对仿真物体进行缩放如公式(3),其中λ为缩放因子.

(2)

(3)

2 三角网格划分算法

从物体表面提取的三维数据点经过公式(1)(2)(3)的处理后,本节就要对处理后的数据点进行网格的划分了,网格划分的好坏直接影响着物体的重建效果,又由于三角形有其自身的优势,它可以很好地展示复杂物体的边界,所以一般采用三角网格来重建物体,有关三角网格划分的算法有很多,比如区域生长算法、分治算法、细分法、网格模型简化算法、二次曲面拟合方法等,通过这些算法划分出三角形必须满足各边上均没有其他数据点存在以及三角形与三角形之间没有边相交现象.这里介绍几种常用的三角网格划分算法[3]:

2.1 区域生长算法

区域生长算法的关键是种子的选取,一般选用初始三角形作为种子,然后根据给定的生长准则进行区域生长,将之后生长出的三角形归入种子一类中,接着继续向外进行生长,循环进行直到满足生长结束条件时终止,具体步骤如下:

2.1.1 初始种子三角形的选取

从离散数据点中最中心的一个数据点V1开始,然后找到距离点V1最近的两个数据点V2和V3,之后将V1,V2,V3用边连接起来构成三角形作为初始种子T1,如图1,并将顶点V1,V2,V3以及相应的边使用适当的数据结构S和W存储起来,另外需要将待扩展的边V1V2、V2V3、V1V3存储在数据结构R中.

2.1.2 扩展新三角形

初始种子T1找到后,以R中存储的边为出发点,继续向外生长寻找新的三角形,以边V1V3为例,先以V1V3为直径画圆,寻找落在圆内的数据点集P(注意如果P中的点太少,可以扩大范围),通过计算找到点集P中与顶点V2在反方向的那些数据点集P′,并有P′⊂P中;接着寻找P′中的最佳点V4,使得∠V1V4V3最大,那么三角形T11便为扩展出的新三角形如图1所示,将此新三角形顶点和边的信息存储在数据结构S和W中,并将R中已经扩展完成的边V1V3去掉,并增加新边V1V4和V3V4,继续扩展R中存储的其他边.

2.1.3 结束条件

检查R中存储的每一条边,以这些边为直径作圆,查看是否有落在圆内的点,若有则继续采用2.1.2的方法扩充新的三角形,若没有则以待扩展边的λ倍为直径作圆扩大范围继续寻找点,直到λ达到给定阈值后终止此边的扩展.

2.2 分治算法

分治算法顾名思义即先将离散数据点划分成块,如图2(a)所示;然后对每块中的数据点进行三角网的划分,这里可以采用区域生长法等方法进行,如图2(b)所示;最后将每部分三角网连接起来形成大的三角网,如图2(c)所示.

图1 区域生长算法图2 分治算法思想

2.3 细分法

细分法经常用在对已经划分好的初始三角网进行插值细分[4]过程中,通常情况下我们采用Delaunay三角化方法或者是区域生长等算法划分出的三角网效果不是最优的,比如在划分的过程中可能会丢失一些数据点而使得最终划分出的三角网格模型失去了一些细节部分的展示,而且所划分的三角网模型最优的状态为每个三角形都应趋于等边三角形,基于这些方面考虑,我们必须在初始三角网的基础上增加一些新的点来细分原有三角网,或者是采用相关算法改变原有三角网的结构使之尽量接近等边三角形.最常用的细分算法有距离函数法、三角形的重心坐标法、内外接圆圆心法等等.

对于初始三角网,如果只是单纯想插入新点来细化细节部分,则可以直接采用相应的算法来增加新点,从而以增加三角形的方式来增强模型细节部分的展示.通常情况下,初始三角网中的三角形面积越小说明当前位置处的细节会更多,因此可以设置面积阈值,当每个三角形的面积小于给定的阈值时,则在此三角形中增加新点来细分这个三角形.

如果想要改变初始三角网中三角形的结构,通常使用的算法是借助内外接圆心法,首先找到需要改变结构的三角形,通常目标为三角形的某个内角小于给定阈值的那些三角形,接着通过指定三角形T的内外接圆心(x1,y1)和(x2,y2)从而找到新的插入点P:(xp,yp),如公式(4)所示,其中R1和R2分别为三角形的内切圆半径和外接圆半径,接着判断三角形T周围的三角形的外接圆是否包含新的插入点P,如果包含则将这些找到的三角形放到一起形成一个封闭的多边形区域,删除此多边形区域里所有的边,最后将点P与多边形的所有顶点相连,通过这种办法必可消除初始三角网中所有的钝角三角形.

(4)

3 特殊效果设置

本节主要实现对于最终形成的三角网进行各种特殊效果的设置[5-9],从而还原物体全貌.首先要确定物体在窗口中的显示效果,包括窗口的横纵比例、视野的位置角度和朝向、远近裁剪面、物体的中心位置坐标等,这些设置都可以借助函数(5)和(6)来实现.

voidgluPerspective(GLdoubleovy,GLdoubleaspect,GLdoublezNear,GLdoublebzFar)

(5)

voidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,GLdoublecentery,GLdoublecenterz,GLdoubleupx,GLdoubleupy,GLdoubleupz)

(6)

对三角网进行光照和材质的设置,函数(7)为光照函数,其中第一个参数为光源号,第二个参数为光源的特性,第三个参数为第二个参数对应的具体值.函数(8)为材质函数,其中第一个参数表示将纹理作用在物体的哪个面上,第二个参数指定一个具体材质,第三个参数为第二个参数对应的具体值.

voidglLight{if}{v}(GLenumlight,GLenumpname,TYPEparam).

(7)

voidglMaterial{if}{v}(GLenumface,GLenumpname,TYPEparam)

(8)

要想使得重建物体更加逼真,可以对模型进行纹理贴图,具体做法就是将指定图片贴到模型表面上,以期达到接近实物的效果,纹理设置函数如(9)所示.此外还可以对周围环境渲染一种雾化效果,使得物体的远处呈现模糊的状态而近处呈现清晰的状态从而达到一种立体效果,雾化函数如(10)所示.

voidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels).

(9)

voidglFog{if}{v}(GLenumpname,TYPEparam).

(10)

4 仿真结果

本文选取了圆球表面的三维数据点,应用上面所讲的方法对圆球表面进行了三角网格的划分,图3(a)是从圆球表面提取到的258个三维数据点,图3(b)为采用区域生长算法对离散数据点进行的三角网格划分,从实验结果来看由于获取的数据点分布是较均匀和对称的,因此划分出的初始三角网也是很标准的并且都接近等边三角形,图3(c)是对图3(b)的三角网进行光照和材质的设置后的整体效果,从结果看到表面不是很光滑,为此对其进行插值细分,图3(d)为插值细分后的结果.本实验在win7系统下,VC6.0平台上完成.

图3 圆球的重建过程

5 结论

本文介绍了三维物体仿真的一般技术手段,采用本文提出算法可以对物体表面进行建模,在建模过程中可以根据需要采取不同的三角网格划分算法或者是细分算法,实验结果表明本文提出的算法是可行的.但是对于较为复杂的物体,比如物体表面有多处空洞、凸起或者凹陷等情况,采用本文的算法就有些费力,因此对于三角网格划分算法还有待于继续研究,以寻找到更先进的方法对各种物体进行仿真.此外对于现实生活中的物体表面一般汇集了多种颜色,我们在仿真的过程中可以采用纹理函数的方式对模型表面不同部位进行设置.以上所提出的问题都是今后研究的重点方向.

猜你喜欢
三角网细分物体
深耕环保细分领域,维尔利为环保注入新动力
深刻理解物体的平衡
结合Delaunay三角网的自适应多尺度图像重叠域配准方法
针对路面建模的Delaunay三角网格分治算法
1~7月,我国货车各细分市场均有增长
揭开物体沉浮的秘密
为什么同一物体在世界各地重量不一样?
整体低迷难掩细分市场亮点
纸媒新希望 看新型报纸如何细分市场逆势上扬
采用传统测量技术进行复杂立交桥工程测量的方法和措施