从网上看到的都是C++的版本,要先继承vtkCommand比较麻烦。Python版的vtk中调用回调函数比较方便,所以先获取调用回调函数的Interactor的Camera,然后将这个Camera同时设置给几个窗口,就能够实现多个窗口相机同步,代码也比较简单。
#coding=utf-8
import vtk
def vtkMyCameraCallback(obj, event):
camera = obj.GetRenderWindow().GetRenderers().GetFirstRenderer().GetActiveCamera()
iren1.GetRenderWindow().GetRenderers().GetFirstRenderer().SetActiveCamera(camera)
iren2.GetRenderWindow().GetRenderers().GetFirstRenderer().SetActiveCamera(camera)
iren1.Render()
iren2.Render()
ren1 = vtk.vtkRenderer()
ren2 = vtk.vtkRenderer()
reWin1 = vtk.vtkRenderWindow()
reWin2 = vtk.vtkRenderWindow()
coneSource = vtk.vtkConeSource()
coneSource.SetResolution(20)
coneSource.Update()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(coneSource.GetOutputPort())
mapper.ScalarVisibilityOff()
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren1.AddActor(actor)
ren2.AddActor(actor)
reWin1.AddRenderer(ren1)
reWin2.AddRenderer(ren2)
iren1 = vtk.vtkRenderWindowInteractor()
iren1.SetRenderWindow(reWin1)
iren2 = vtk.vtkRenderWindowInteractor()
iren2.SetRenderWindow(reWin2)
style = vtk.vtkInteractorStyleTrackballCamera()
iren1.SetInteractorStyle(style)
iren2.SetInteractorStyle(style)
iren1.AddObserver("InteractionEvent", vtkMyCameraCallback)
iren2.AddObserver("InteractionEvent", vtkMyCameraCallback)
ren1.ResetCamera()
ren2.ResetCamera()
iren1.Initialize()
iren2.Initialize()
iren1.Start()
iren2.Start()