VTK:在特定情况下更新渲染窗口中的图像失败

2 投票
1 回答
602 浏览
提问于 2025-04-17 22:44

-----更新和解决方案-------

除非在

UpdateData()

这个函数里调用

renderwindow.Render()

,否则行为会很不稳定。所以需要更新renderwindow。


我正在尝试在vtk中显示非常大的图像。为此,我把图像分成了几个小块,现在我想在这些小块之间浏览,并在此过程中调整相机的位置。

目前,我把WASD键分配给了可以上下左右移动的功能。每当我在数据集中上下移动时,视图都会正常更新,但当我左右移动时,图像却不动。如果我再上下移动一次,图像就会跳到正确的位置。简单来说,只有左右移动不工作。这让我感到困惑,因为我几乎使用的是相同的函数来处理这些移动,附上我的示例代码:

# current position is a  list  with x y z coordinates as filenames
#reader
metaImageReader = vtk.vtkMetaImageReader()
metaImageReader.SetFileName(filefolder + "%03d_%03d_%03d"%(currentPosition[0],currentPosition[1], currentPosition[2]) + extension)
metaImageReader.SetDataScalarTypeToUnsignedChar()
#metaImageReader.SetFileDimensionality(3)
metaImageReader.Update()

#create renderwindow
renWin = vtk.vtkRenderWindow()
renWin.SetSize(600,300)



#create renderer1
renderer_2d = vtk.vtkRenderer()
renderer_2d.SetViewport(0,0,0.5,1)
renderer_2d.SetBackground(1.0,1.0,1.0)
renWin.AddRenderer(renderer_2d)

#create renderer2
renderer_3d = vtk.vtkRenderer()
renderer_3d.SetViewport(0.5,0,1,1)
renderer_3d.SetBackground(0.0,0.0,0.0)
renWin.AddRenderer(renderer_3d)


mapper = vtk.vtkImageSliceMapper()
mapper.SetInput(metaImageReader.GetOutput())
mapper.Update()

actor = vtk.vtkImageSlice()
actor.SetMapper(mapper)
actor.Update()




renderer_2d.AddActor(actor)


def updateData():
    global metaImageReader, actor, mapper, currentPosition, filefolder, extension, viewer, origin
    metaImageReader.SetFileName(filefolder + "%03d_%03d_%03d"%(currentPosition[0],currentPosition[1], currentPosition[2]) + extension)
    metaImageReader.Update()
    mapper.Update()
    actor.Update()


def keypress(obj,event):

    key = obj.GetKeySym()
    print key
    if key == "w":
        print "w"
        moveUp()
    elif key == "s":
        print "s"
        moveDown()
    elif key == "d":
        print "d"
        moveRight()
    elif key == "a":
        print "a"
        moveLeft()


def moveUp():
    global currentPosition
    x,y,z = currentPosition
    y = y-1
    currentPosition = x,y,z
    updateData()

def moveDown():
    global currentPosition
    x,y,z = currentPosition
    y = y+1
    currentPosition = x,y,z
    updateData()

def moveRight():

    global currentPosition
    x,y,z = currentPosition
    x = x+1
    currentPosition = x,y,z
    updateData()

def moveLeft():

    global currentPosition
    x,y,z = currentPosition
    x = x-1
    currentPosition = x,y,z
    updateData()

#create interactor
iren = vtk.vtkRenderWindowInteractor()
iren.AddObserver("KeyPressEvent", keypress)
iren.SetRenderWindow(renWin)

#visualization pipeline
# Source -> Reader -> Filter -> Mapper -> Actor
iren.Start()
renWin.Render() 

1 个回答

0

除非在

UpdateData()

这个函数里调用

renderwindow.Render()

,否则程序的表现会很不稳定。所以,renderwindow 也需要被更新。

撰写回答