渲染在vtkCommand中创建的actor(回调)

时间:2019-01-23 23:45:26

标签: python vtk

我正在尝试编写一个程序,当按下箭头键时,该程序可以显示并循环显示不同文件格式的图像。我发现,设置我的阅读器->映射器-> 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()

1 个答案:

答案 0 :(得分:1)

好吧,您绝对可以在回调中添加或删除参与者。要立即再次渲染场景,只需调用__init__.py

启动没有任何可见角色且没有明确定义的摄影机的渲染器时,通常需要iren.Render()。自动ResetCamera在初始化期间仅被调用一次,这就是为什么在ResetCamera之前调用foo()使对象可见。

iren.Start()