直接使用vtk自带的箭头源绘制的箭头长度固定为1mm,可以调整的参数都是在长度为1mm下的其他属性的调整,因此绘制任意长度的箭头需要自己代码实现。
# -*- coding : UTF-8 -*-
# @file : draw_arrow.py
# @Time : 2023/12/24 0024 20:49
# @Author : Administrator
import vtk
def 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 polydata
def 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 = 200
polydata = create_single_vector_arrow_data(origin, target, length)
polydata = generate_normals_arrow(polydata)
write_polydata(polydata, "arrow.vtk")
绘制箭头如下,水平向右,长度为20mm。