Python编写vtk中Glyph3D不显示的解决办法
网络上的的VTK教程,大多是vtk早期版本的c++代码,其可视化管线支持使用SetInputConnection() 和GetOutputPort(),还支持vtk5.0版本之前的SetInput()和GetOutput() 方法(在python中是SetInputData ())。
据个人测试,在python中利用SetInputData ()和GetOutput()方法有时候在窗口中不会显示,但编译无错误。例如Glyph3D类就不能使用旧版本的方法建立可视化管道。所以在编写python程序时,尽量使用SetInputConnection() 和GetOutputPort()方法。代码如下,参考自《vtk图像图形开发进阶》:
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import vtk
from vtkmodules.vtkFiltersCore import vtkPolyDataNormals, vtkMaskPoints, vtkGlyph3D
from vtkmodules.vtkFiltersSources import vtkArrowSource
from vtkmodules.vtkIOLegacy import vtkPolyDataReader
from vtkmodules.vtkRenderingCore import vtkPolyDataMapper, vtkActor, vtkRenderer, vtkRenderWindow, \
vtkRenderWindowInteractor
reader = vtkPolyDataReader()
reader.SetFileName('fran_cut.vtk')
reader.Update()
normFilter = vtkPolyDataNormals()
normFilter.SetInputData(reader.GetOutput())
normFilter.SetComputePointNormals(1)
normFilter.SetComputeCellNormals(0)
normFilter.SetAutoOrientNormals(1)
normFilter.SetSplitting(0)
normFilter.Update()
mask = vtkMaskPoints()
mask.SetInputData(normFilter.GetOutput())
mask.SetMaximumNumberOfPoints(1000)
mask.RandomModeOn()
arrow = vtkArrowSource()
glyph = vtkGlyph3D()
glyph.SetInputConnection(mask.GetOutputPort())
glyph.SetSourceConnection(arrow.GetOutputPort())
glyph.SetVectorModeToUseNormal()
glyph.SetScaleFactor(0.01)
originMapper = vtkPolyDataMapper()
originMapper.SetInputData(reader.GetOutput())
originActor = vtkActor()
originActor.SetMapper(originMapper)
normedMapper = vtkPolyDataMapper()
# 支持SetInputData ()和GetOutput()
normedMapper.SetInputData(normFilter.GetOutput())
normedActor = vtkActor()
normedActor.SetMapper(normedMapper)
glyphMapper = vtkPolyDataMapper()
# 这里使用SetInputData ()和GetOutput()则不会显示Arrow
glyphMapper.SetInputConnection(glyph.GetOutputPort())
glyphActor = vtkActor()
glyphActor.SetMapper(glyphMapper)
glyphActor.GetProperty().SetColor(1, 0, 0)
originRender = vtkRenderer()
originRender.AddActor(originActor)
originRender.SetViewport(0.0, 0.0, 0.33, 1.0)
normedRender = vtkRenderer()
normedRender.AddActor(normedActor)
normedRender.SetViewport(0.33, 0.0, 0.66, 1.0)
glyphRender = vtkRenderer()
glyphRender.AddActor(glyphActor)
glyphRender.AddActor(normedActor)
glyphRender.SetViewport(0.66, 0.0, 1.0, 1.0)
renderWindow = vtkRenderWindow()
renderWindow.AddRenderer(originRender)
renderWindow.AddRenderer(normedRender)
renderWindow.AddRenderer(glyphRender)
renderWindow.SetSize(640, 320)
renderWindowInteractor = vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
renderWindow.Render()
renderWindow.SetWindowName("Mass Property")
renderWindowInteractor.Start()
运行结果如图: