目的
符号化有限元模型的节点矢量属性(应力等),将其可视化显示。
代码
构建drawVectorField函数,用于矢量场的符号化显示。代码如下:
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)
在上面代码中,由于有限元模型通常节点和单元数量很多,为了方便观察,我们可以对数据进行降采样。关键代码如下:
maskPoints.SetOnRatio(sample_ratio) # 采样率
其中sample_ratio
为采样率。
结果
参考
[1] VTK使数据符号化显示矢量数据