基于VTK的系留气球建模及可视化技术研究

2022-11-24 07:21李佩琳
西安航空学院学报 2022年3期
关键词:控件四边形引擎

吕 韵,李佩琳

(中国电子科技集团公司第三十八研究所 浮空平台部,合肥 230088)

0 引言

可视化可以理解为运用图像处理技术和计算机图形学,将科学计算中的数据转换成图像数据,在显示屏上显示并可以进行交互处理的方法和技术[1]。随着计算机技术的发展和算法效率、精度的不断提高,可视化技术已经广泛应用到产品设计、医学、地球科学、建筑等领域。

随着AI技术的发展,三维的可视化技术已应用于多个领域[2-6]。常用的实现三维可视化技术,主要有[7]:(1)直接在现有三维软件上进行建模;(2)在现有的三维引擎上进行开发;(3)源代码开放的可视化开发工具VTK(Visualization Toolkit)。VTK基于Open-GL工具包,具有移植性好、开放源代码等优点,是目前应用广泛的可视化开发工具。

系留气球是系在地面绞车并可控制其在大气中飘浮高度的一种重要的浮空器,系留气球一般由主气囊、尾翼、副气囊、整流罩等部分组成,气球可以携带设备升空,并进行长时间空中系留,可实现长时间、远距离的监控或探测[8-9]。为开发系留气球的设计软件,进一步优化系留气球的设计流程,本文使用C++语言,以Qt作为界面开发平台,结合VTK可视化库,构建几何数据进行软件开发的探索,实现了系留气球的几何模型和三维可视化显示。

1 VTK可视化

如前所述,VTK以其移植性好、源码开放等优点应用广泛。实际上,VTK的工具包结构能嵌入任何一种开发工具中,用户可对开发的全程进行控制,进行专业应用的开发。VTK已经在类库中集成了大量的可视化算法,用户可直接使用,与此同时,VTK允许开发人员根据需要在已有的算法和结构之上加入自己的算法和接口[10-11]。

VTK可视化涉及两个重要术语:渲染引擎和可视化管线。其中,渲染引擎主要为数据从模型生产图像的过程;可视化管线为获取或创建数据、处理数据以及将数据写入文件或者将数据传递给渲染引擎进行显示的运行结构,包括数据对象、处理对象和数据流方向三个要素[12]。VTK可视化流程如图1所示。

2 几何构建

VTK几何数据表达由几何结构和拓扑结构组成,几何结构描述对象的空间位置关系,拓扑结构描述对象的构成形式。VTK构建单个几何体可将其分解成多个三角形(或四边形)单元,分解的单元节点构成数据集,连接节点构成数据集的拓扑结构形成几何体的表面。这样所得数据集可直在VTK中进行处理和可视化。

2.1 外形创建

VTK提供了一些简单几何体的生成函数,对于一些复杂的造型需要开发者自定义几何外形数据。复杂的造型其几何形状也是由点、线、面构成的。系留气球的设计软件开发也离不开点、线、面的创建与操作。

(1)创建点。点是组成所有几何模型的基础,且所有数据存储的基础都是基于点的存储。首先计算几何外形表面上点的坐标,创建点数据。在VTK中,用vtkPoints类来存储点,利用InsertNextPoint插入下一个点的坐标,每个点会按插入顺序生成ID值vtkIdType。系留气球创建点具体实现代码如下:

//声明一个vtkPoints指针

vtkSmartPointerpoints=vtkSmartPointer::New();

//插入点坐标x,y,z

for(i=0;i

points->InsertNextPoint(x,y,z);

(2)创建四边形单元。将四个点的坐标按右手螺旋法则外法向量的方向连接起来,即可创建四边形单元。在VTK中用vtkCellArray存储单元,利用InsertNextCell插入下一个单元,每个单元中用InsertCellPoint来插入单元中点的连接顺序。系留气球创建四边形单元具体实现代码如下:

//声明一个vtkCellArray指针

vtkSmartPointercells=vtkSmartPointer::New();

//插入一个四边形单元

cells->InsertNextCell(4);

//依次插入需要连接的点的ID

cells->InsertCellPoint(ID1);

cells->InsertCellPoint(ID2);

cells->InsertCellPoint(ID3);

cells->InsertCellPoint(ID4);

(3)创建多边形数据集。VTK中多边形数据集vtkPolyData是应用非常广泛的一种数据类型,是数据与算法之间的桥梁。该数据集由各种单元构成,后续对几何体的一些算法(切割、合并等)都要通过vtkPolyData实现。系留气球创建多边形数据集具体代码如下:

//生成几何体的PolyData数据

vtkSmartPointerdata=vtkSmartPointer::New();

data->SetPoints(points);

data->SetPolys(cells);

2.2 曲面操作

当几何形状出现相交时,需要对几何外形进行修剪,VTK中常用的是vtkClipPolyData切割类和vtkAppendPolyData合并类。当数据需要进行光滑、三角化时,通常使用过滤器Filter来处理。这些类的输出为vtkPolyData类型的数据,将最终处理好的数据传入映射器Mapper就完成了数据对象的生成和处理。系留气球的曲面操作如下:

(1)切割。截留气球的切割代码如下:

vtkSmartPointerclip=

vtkSmartPointer::New();

clip->SetClipFunction(implicitFunction);

clip->SetInputData(data);

clip->Update();

(2)数据合并。截留气球的数据合并代码如下:

vtkSmartPointerappend=

vtkSmartPointer::New();

append->AddInputData(clip->GetOutput());

append->AddInputData(data);

append->Update();

3 三维模型的可视化

经过以上的创建与操作处理,就可以把映射器传递给渲染引擎进行显示和交互。

3.1 三维模型显示

根据图1所示的可视化流程,数据流依次通过vtkActor、vtkRender、vtkRenderWindow。

(1)vtkActor用于在场景中描述一个对象的属性,包括一个物体的显示模式、颜色、透明度等。系留气球的实现代码如下:

vtkSmartPointeractor=vtkSmartPointer::New();

actor->SetMapper(mapper);

actor->GetProperty()->SetRepresentationToSurface();

actor->GetProperty()->SetColor(0,0,1);

actor->GetProperty()->SetOpacity(0.8);

(2)vtkRenderWindow用于创建渲染物体的窗口,vtkRenderer则是渲染窗口的渲染器。渲染窗口可以方便用户对场景中的图形进行操作和控制,如灯光和观察物体的视角等。每一个物体最终都会渲染到渲染窗口中[13]。系留气球的实现代码如下:

vtkSmartPointerrender=vtkSmartPointer::New();

render->AddActor(actor);

vtkSmartPointerrenwin=

vtkSmartPointer::New();

renwin->AddRenderer(render);

3.2 交互显示模块

vtkRenderWindowInteractor提供用户对渲染窗口中的物体进行拾取、缩放、平移等交互操作。利用Qt的信号槽机制,可以很方便的用Qt控件实现对物体的操作。在VTK中也提供了多种简单交互操作的类,而且可以通过继承vtkCommand类的方式自定义回调函数。

3.3 系留气球可视化实例

在Qt平台上,结合VTK库使用C++语言开发系留气球三维可视化平台,主界面如图2所示。通过读取输入参数,计算系留气球结构的点数据和单元数据,然后运用本文的几何建模和可视化方法,定义系留气球外形,最后通过VTK渲染引擎实现系留气球的可视化。

利用Qt控件可实现对系留气球显示属性的控制,隐藏除主、副气囊之外的其他部分,如图3所示;更改副气囊的颜色和主气囊透明度,如图4所示。

利用Qt控件和vtkImplicitPlaneWidget类实现切割交互功能,用户既可以通过控件设置平面参数来定义切割平面,也可以在渲染窗口中直接拖动来确定平面,同时会显示当前平面的参数。系留气球的切割交互界面如图5所示。

4 结论

根据VTK功能和可视化机制,基于VTK几何构建和三维模型可视化方法在Qt平台上使用C++语言进行系留气球设计与优化软件的开发。通过创建点、四边形单元、多边形数据集和曲面操作进行几何构建,并通过三维可视化技术构建系留气球三维可视化平台,所建平台包括显示控制和截面切割等功能。对系留气球三维可视化平台的测试结果表明,所建平台满足系留气球的三维可视化要求,可进一步用于系留气球的性能分析软件开发。

猜你喜欢
控件四边形引擎
江阴市“三个创新”打造危化品安全监管新引擎
基于C++Builder 的电子邮件接收程序设计*
使用“填表单”微信小程序 统计信息很方便
新海珠,新引擎,新活力!
基于.net的用户定义验证控件的应用分析
怎样数出图形的个数
车坛往事4:引擎进化之屡次失败的蒸汽机车
四边形逆袭记
数学潜能知识月月赛
One Engine Left只剩下一个引擎