在使用vtk的時候,鼠標會默認響應一些事件,比如MouseWheelBackward時,actor縮小,MouseWheelForward時,actor放大;MouseMove時,actor會隨之旋轉等等。
如下我們創建了一個cyliner,使用鼠標交互:

如何將這些默認事件屏蔽呢,參考了vtk的python的用戶交互demo和網上的一些資料,發現vtkInteractorStyleTrackballCamera這個類具有鼠標交互的方法和屬性,廢話就不多說了,結合C#版本,
看一下這個類的定義:

相當於移動camera,屏幕上的actor會進行響應對應的事件。
直接上代碼:
#!/usr/bin/env python # This simple example shows how to do basic rendering and pipeline # creation. import vtk class MouseInteractorHighLightActor(vtk.vtkInteractorStyleTrackballCamera): def __init__(self, parent = None): self.AddObserver("MouseMoveEvent", self.MouseMoveEvent) self.AddObserver("MouseWheelForwardEvent", self.MouseWheelForwardEvent) self.AddObserver("MouseWheelBackwardEvent", self.MouseWheelBackwardEvent) def MouseMoveEvent(self, obj, event): pass def MouseWheelBackwardEvent(self, obj, event): pass def MouseWheelForwardEvent(self, obj, event): pass def main(): colors = vtk.vtkNamedColors() # Set the background color. bkg = map(lambda x: x / 255.0, [26, 51, 102, 255]) colors.SetColor("BkgColor", *bkg) # This creates a polygonal cylinder model with eight circumferential # facets. cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(8) # The mapper is responsible for pushing the geometry into the graphics # library. It may also do color mapping, if scalars or other # attributes are defined. cylinderMapper = vtk.vtkPolyDataMapper() cylinderMapper.SetInputConnection(cylinder.GetOutputPort()) # The actor is a grouping mechanism: besides the geometry (mapper), it # also has a property, transformation matrix, and/or texture map. # Here we set its color and rotate it -22.5 degrees. cylinderActor = vtk.vtkActor() cylinderActor.SetMapper(cylinderMapper) cylinderActor.GetProperty().SetColor(colors.GetColor3d("red")) cylinderActor.RotateX(30.0) cylinderActor.RotateY(-45.0) # Create the graphics structure. The renderer renders into the render # window. The render window interactor captures mouse events and will # perform appropriate camera or actor manipulation depending on the # nature of the events. ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # add the custom style style = MouseInteractorHighLightActor() style.SetDefaultRenderer(ren) iren.SetInteractorStyle(style) # Add the actors to the renderer, set the background and size ren.AddActor(cylinderActor) ren.SetBackground(colors.GetColor3d("BkgColor")) renWin.SetSize(300, 300) renWin.SetWindowName('Cylinder') # This allows the interactor to initalize itself. It has to be # called before an event loop. iren.Initialize() # We'll zoom in a little by accessing the camera and invoking a "Zoom" # method on it. ren.ResetCamera() ren.GetActiveCamera().Zoom(1.5) renWin.Render() # Start the event loop. iren.Start() if __name__ == '__main__': main()
效果如下:

vtk 的python版本的User Interaction的Demo的鏈接如:https://lorensen.github.io/VTKExamples/site/Python/
camera基本原理參考:https://blog.csdn.net/wzheng92/article/details/79935059
