Python编写vtkGlyph3D不显示的解决办法

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()

运行结果如图:
运行结果如图

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值