【VTK+有限元后处理】符号化矢量场绘制

目的

符号化有限元模型的节点矢量属性(应力等),将其可视化显示。

代码

构建drawVectorField函数,用于矢量场的符号化显示。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def drawVectorField(self, FEMapper, sample_ratio = 10, scale_ratio = 0.015, symbol = 'arrow'):
self.main_actor.SetMapper(FEMapper)
self.main_actor.GetProperty().SetOpacity(0.3) # 设置透明度
self.main_actor.GetProperty().SetColor(241 / 255, 135 / 255, 184 / 255) # 设置颜色
# 数据采样
maskPoints = vtk.vtkMaskPoints()
maskPoints.SetInputData(FEMapper.GetInput())
maskPoints.SetOnRatio(sample_ratio) # 采样率
maskPoints.Update()
# 符号化向量场
glyph3D = vtk.vtkGlyph3D() # vtkGlyph3D是一个过滤器,他会将固定的几何数据(符号数据)复制到输入的数据集的每一个点上
glyph3D.SetInputData(maskPoints.GetOutput())
if symbol == 'arrow':
arrow = vtk.vtkArrowSource() # 箭头符号
arrow.Update()
glyph3D.SetSourceData(arrow.GetOutput()) # 设置符号
elif symbol == 'cone':
cone = vtk.vtkConeSource() # 圆锥符号
cone.SetResolution(6) # 设置用于表示圆锥的面数
cone.Update()
glyph3D.SetSourceData(cone.GetOutput()) # 设置符号
# glyph3D.SetVectorModeToUseNormal() # 使用法向控制符号方向
glyph3D.SetVectorModeToUseVector() # 使用向量控制符号方向
glyph3D.SetScaleModeToScaleByVector() # 使用点上的vector数据控制缩放
# glyph3D.SetScaleModeToDataScalingOff() # 这里没有标量,所以关闭符号缩放控制
glyph3D.SetScaleFactor(scale_ratio) # 设置缩放比例
glyph3D.Update()

glMapper = vtk.vtkDataSetMapper()
glMapper.SetInputData(glyph3D.GetOutput())
glMapper.Update()
glActor = vtk.vtkActor()
glActor.SetMapper(glMapper)
glActor.GetProperty().SetColor(0.0, 0.79, 0.34) # glyphActor

self.renderer.AddActor(self.main_actor)
self.renderer.AddActor(glActor)

在上面代码中,由于有限元模型通常节点和单元数量很多,为了方便观察,我们可以对数据进行降采样。关键代码如下:

1
maskPoints.SetOnRatio(sample_ratio)  # 采样率

其中sample_ratio为采样率。

结果

![GIF 2022-11-20 9-33-08](D:\OneDrive\桌面\GIF 2022-11-20 9-33-08.gif)

参考

[1] VTK使数据符号化显示矢量数据