我正在尝试编写一个程序,当按下箭头键时,该程序可以显示并循环显示不同文件格式的图像。我发现,设置我的阅读器->映射器-> actor管道,然后启动我的RenderWindowInteractor可以渲染该actor,但是将这段代码移到RenderWindowInteractor的KeyPressEvent的回调中却无法渲染actor。一旦事件循环开始,是否还需要其他步骤来设置新演员,还是我犯了其他错误?
import vtk
#Create the renderer that will display our actors
ren = vtk.vtkRenderer()
actor = None
#Maps the data from the Nifti file 'filename' onto a vtkImageSlice actor
def LoadNifti():
# load head MRI in NIFTI format
reader = vtk.vtkNIFTIImageReader()
reader.SetFileName("head.nii")
reader.Update()
# Add an ImageSliceMapper, which maps data to an ImageSlice Actor
mapper = vtk.vtkImageSliceMapper()
#Set the slice position to the camera focal point
mapper.SliceAtFocalPointOn()
mapper.SetInputConnection(reader.GetOutputPort())
# Add an ImageSlice actor, which represents a slice as an image
global actor
actor = vtk.vtkImageSlice()
actor.SetMapper(mapper)
#Placeholder for when I have DICOM working
def ShowDICOM(filename):
pass
#Create a RenderWindow to display images from the Renderer
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
#Wrap the RenderWindow in a RenderWindowInteractor to catch key and mouse events
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
def foo():
LoadNifti()
ren.AddActor(actor)
##Extend the default functionality of the interactor and its style with custom listeners
def KeyPressEvent(obj, ev):
foo()
print("This verifies that the callback is triggered")
iren.AddObserver("KeyPressEvent", KeyPressEvent)
#Start the program
###########################################################################
# WHEN foo() IS PRESENT BELOW, THE ACTOR WILL RENDER IMMEDIATELY.
# WHEN foo() IS ABSENT BELOW, CALLING foo() BY TRIGGERING THE KeyPressEvent
# IS NOT SUFFICIENT TO HAVE THE ACTOR RENDER.
###########################################################################
foo()
#According to the docs, the Start method will initialize iren and render renWin automatically
iren.Start()
答案 0 :(得分:1)
好吧,您绝对可以在回调中添加或删除参与者。要立即再次渲染场景,只需调用__init__.py
。
启动没有任何可见角色且没有明确定义的摄影机的渲染器时,通常需要iren.Render()
。自动ResetCamera
在初始化期间仅被调用一次,这就是为什么在ResetCamera
之前调用foo()
使对象可见。
iren.Start()