写两个程序创建数据集
- 六个特征点,
- 尺寸大小(长宽比、面积大小)
- 随机干扰,干扰强度
Glyph Arrow
以箭头方式可视化流场
创建了一个三维[4,4,4]的sgrid.vtk的网格文件,和一个polydata类型的sgridExtend.vtk文件
"""
===============================
-*- coding:utf-8 -*-
Author :hanjinyue
Time :2021/4/2 12:06
File :HelloVTK\SgridExtend.py
================================
"""
import vtk
#data
p = vtk.vtkPoints()#点集
#创建向量数组
vectors = vtk.vtkFloatArray()#向量数组
vector = [0.0,0.0,0.0]
vectors.SetNumberOfComponents(3)
sum = 0
for i in range(4):
for j in range(4):
for k in range(4):
p.InsertPoint(sum,k+5.0,j+5.0,i+5.0)
vector[0] = 0.5*k+0.1
vector[1] = 0.2*j+0.2
vector[2] = 0.3*i + 0.3
vectors.InsertNextTuple(vector)
sum = sum +1
weights = vtk.vtkDoubleArray()
weights.SetNumberOfValues(sum)
for i in range(sum):
weights.SetValue(i,i+0.5)#第i个点的属性为i+0.5
#结构化网格数据
sgrid = vtk.vtkStructuredGrid()
dims = [4,4,4]
sgrid.SetDimensions(dims)
sgrid.SetPoints(p)
sgrid.GetPointData().SetVectors(vectors)
sgrid.GetPointData().SetScalars(weights)
writesgrid = vtk.vtkStructuredGridWriter()
writesgrid.SetFileName("sgrid.vtk")
writesgrid.SetInputData(sgrid)
writesgrid.Write()
#extract plane
compPlane = vtk.vtkStructuredGridGeometryFilter()#polyData
compPlane.SetInputData(sgrid)
compPlane.SetExtent(0, 3, 0, 3, 0, 0)
#将生成的数据集写到polydata.vtk文件里,保存到当前目录下
writer = vtk.vtkPolyDataWriter()
writer.SetFileName("sgridExtend.vtk")
writer.SetInputConnection(compPlane.GetOutputPort())
writer.Write()
#arrow
arrow = vtk.vtkArrowSource()
#glypy
glyph = vtk.vtkGlyph3D()
glyph.SetInputConnection(compPlane.GetOutputPort())
glyph.SetSourceConnection(arrow.GetOutputPort())
glyph.SetVectorModeToUseVector()
glyph.SetScaleModeToScaleByVector()
glyph.SetScaleFactor(0.2)
spikeMapper = vtk.vtkPolyDataMapper()
spikeMapper.SetInputConnection(glyph.GetOutputPort())
spikeActor = vtk.vtkActor()
spikeActor.SetMapper(spikeMapper)
spikeActor.GetProperty().SetColor(0.0, 0.79, 0.34)#glyphActor
#4.1 outline:获取外边廓线
outline = vtk.vtkOutlineFilter()
outline.SetInputData(sgrid)
outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInputConnection(outline.GetOutputPort())
outlineActor = vtk.vtkActor()
outlineActor.SetMapper(outlineMapper)
outlineProp = outlineActor.GetProperty()
outlineProp.SetColor(1, 0, 0)#红色
# Create the RenderWindow, Renderer and both Actors
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# Add the actors to the renderer, set the background and size
#ren.AddActor(franActor)
ren.AddActor(spikeActor)
ren.AddActor(outlineActor)
renWin.SetSize(500, 500)
ren.SetBackground(0.1, 0.2, 0.4)
# Set a nice camera position.
ren.ResetCamera()
cam1 = ren.GetActiveCamera()
cam1.Zoom(1.4)
cam1.Azimuth(110)
iren.Initialize()
renWin.Render()
iren.Start()
Glyph cone 圆锥
"""
===============================
-*- coding:utf-8 -*-
Author :hanjinyue
Time :2021/4/2 14:36
File :HelloSgridGlyph.py
================================
"""
import vtk
reader = vtk.vtkStructuredGridReader()
reader.SetFileName("structuredGrid.vtk")
cone = vtk.vtkConeSource()
cone.SetResolution(6)#设置用于表示圆锥的面数
transform = vtk.vtkTransform()
transform.Translate(0.0, 0.0, 0.0)
transformF = vtk.vtkTransformPolyDataFilter()#转换多边形数据集的点以及相关的法线和向量,继承自vtkPolyDataAlgorithm
transformF.SetInputConnection(cone.GetOutputPort())
transformF.SetTransform(transform)
glyph = vtk.vtkGlyph3D()#继承自vtkPolyDataAlgorithm
glyph.SetInputConnection(reader.GetOutputPort())
glyph.SetSourceConnection(cone.GetOutputPort())
glyph.SetVectorModeToUseVector()#指定使用法线执行矢量操作。
glyph.SetScaleModeToScaleByVector()#SetScaleMode(),可以按标量缩放,也可以按矢量/法线幅度缩放。
glyph.SetScaleFactor(0.2)#指定比例因子以缩放对象。
spikeMapper = vtk.vtkPolyDataMapper()
spikeMapper.SetInputConnection(glyph.GetOutputPort())
spikeActor = vtk.vtkActor()
spikeActor.SetMapper(spikeMapper)
spikeActor.GetProperty().SetColor(0.0, 0.79, 0.34)#glyphActor
#4.1 outline:获取外边廓线
outline = vtk.vtkOutlineFilter()
outline.SetInputConnection(reader.GetOutputPort())
outlineMapper = vtk.vtkPolyDataMapper()#为什么使用vtkPolyDataMapper
outlineMapper.SetInputConnection(outline.GetOutputPort())
#void vtkPolyDataMapper::SetInputData ( vtkPolyData * in )
outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInputConnection(outline.GetOutputPort())
print("outline.GetOutputPort().type = ",outline.GetOutputPort())
outlineActor = vtk.vtkActor()
outlineActor.SetMapper(outlineMapper)
outlineProp = outlineActor.GetProperty()
outlineProp.SetColor(1, 0, 0)#红色
# Create the RenderWindow, Renderer and both Actors
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# Add the actors to the renderer, set the background and size
#ren.AddActor(franActor)
ren.AddActor(spikeActor)
ren.AddActor(outlineActor)
renWin.SetSize(100, 100)
ren.SetBackground(0.1, 0.2, 0.4)
print("end1")
# Set a nice camera position.
ren.ResetCamera()
cam1 = ren.GetActiveCamera()
cam1.Zoom(1.4)
cam1.Azimuth(110)
iren.Initialize()
renWin.Render()
iren.Start()
print("end")