VTK学习笔记(四十二)vtk绘制箭头

直接使用vtk自带的箭头源绘制的箭头长度固定为1mm,可以调整的参数都是在长度为1mm下的其他属性的调整,因此绘制任意长度的箭头需要自己代码实现。

# -*- coding : UTF-8 -*-# @file : draw_arrow.py# @Time : 2023/12/24 0024 20:49# @Author : Administratorimport vtkdef create_single_vector_arrow_data(origin, target, length):vtk.vtkMath.Subtract(target, origin, target)points = vtk.vtkPoints()points.InsertNextPoint(origin)vertex = vtk.vtkVertex()vertex.GetPointIds().SetNumberOfIds(points.GetNumberOfPoints())for i in range(points.GetNumberOfPoints()):vertex.GetPointIds().SetId(i,i)normals = vtk.vtkDoubleArray()normals.SetNumberOfComponents(3)normals.InsertNextTuple(target)scalars = vtk.vtkDoubleArray()scalars.SetNumberOfComponents(1)scalars.SetName("scalars")scalars.InsertNextTuple1(length)vertices = vtk.vtkCellArray()vertices.InsertNextCell(vertex)polydata = vtk.vtkPolyData()polydata.SetPoints(points)# 赋予起点polydata.SetVerts(vertices) # 赋予拓扑polydata.GetPointData().SetNormals(normals) # 赋予向量朝向polydata.GetPointData().SetScalars(scalars) # 赋予向量长度return polydatadef generate_normals_arrow(polydata):arrow = vtk.vtkArrowSource()arrow.Update()glyph = vtk.vtkGlyph3D()glyph.SetInputData(polydata)glyph.SetSourceData(arrow.GetOutput())glyph.SetScaleFactor(0.1)glyph.SetVectorModeToUseNormal()glyph.Update()return glyph.GetOutput()def write_polydata(polydata, name):writer = vtk.vtkPolyDataWriter()writer.SetInputData(polydata)writer.SetFileName(name)writer.Write()if __name__ == "__main__":origin = [0, 0, 0]target = [1, 0, 0]length = 200polydata = create_single_vector_arrow_data(origin, target, length)polydata = generate_normals_arrow(polydata)write_polydata(polydata, "arrow.vtk")

绘制箭头如下,水平向右,长度为20mm。

参考:【VTK】VTK绘制箭头——支持设置起点、方向和长度