VTK中的vtkRenderWindow()
可以创造一个显示窗口,我们可以配置多个vtkRenderer()
,并用SetViewPort()
来对该窗口进行多分屏。这里实现了多分屏的实时同步操作(通过控制相机对物体旋转、放大、缩小)。
import vtk
class InteractionCallback:
def __init__(self):
self.renderer_list = []
def execute(self, this, event):
if event == "ModifiedEvent":
position = this.GetPosition()
focal_point = this.GetFocalPoint()
view_up = this.GetViewUp()
camera1 = self.renderer_list[0].GetActiveCamera()
camera2 = self.renderer_list[1].GetActiveCamera()
if this == camera1:
camera2.SetPosition(position)
camera2.SetFocalPoint(focal_point)
camera2.SetViewUp(view_up)
elif this == camera2:
camera1.SetPosition(position)
camera1.SetFocalPoint(focal_point)
camera1.SetViewUp(view_up)
def render(data1, data2):
# 创建一个窗口
render_window = vtk.vtkRenderWindow()
render_window.SetSize(600, 300)
callback = InteractionCallback()
# 分屏
# 创建renderer
renderer1 = vtk.vtkRenderer()
renderer1.SetViewPort(0.0, 0.0, 0.5, 1.0)
# 根据需求创建自己的actor
mapper1 = vtk.vtkPolyDataMapper()
mapper1.SetInputData(data1)
mapper1.Update()
actor1 = vtk.vtkActor()
actor1.SetMapper(mapper1)
renderer1.AddActor(actor1)
callback.renderer_list.append(renderer1)
renderer1.GetActiveCamera().AddObserver(vtk.vtkCommand.ModifiedEvent, callback.execute)
# 重复之前的操作创建和配置renderer,多分屏可用loop
renderer2 = vtk.vtkRenderer()
renderer2.SetViewPort(0.5, 0.0, 1.0, 1.0)
# 根据需求创建自己的actor
mapper2 = vtk.vtkPolyDataMapper()
mapper2.SetInputData(data2)
mapper2.Update()
actor2 = vtk.vtkActor()
actor2.SetMapper(mapper2)
renderer2.AddActor(actor2)
callback.renderer_list.append(renderer2)
renderer2.GetActiveCamera().AddObserver(vtk.vtkCommand.ModifiedEvent, callback.execute)
interactor = vtk.vtkRenderWindowInteractor()
style = vtk.vtkInteractorStyleTrackballCamera()
interactor.SetInteractorStyle(style)
interactor.SetRenderWindow(render_window)
interactor.Initialize()
interactor.Start()