• vtk 屏蔽鼠标交互事件


    在使用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

  • 相关阅读:
    前端页面模拟浏览器搜索功能Ctrl+F实现
    正则表达式中?=和?:和?!的理解
    JRebel激活教程
    BAT脚本一键启动多个程序
    WinInet简介及操作流程
    通过线程传递消息
    两串口收发测试
    获取PC可用串口端口,并将其在combo box中显示
    为MFC应用程序添加登录对话框界面
    Using CInternetFile open an Url
  • 原文地址:https://www.cnblogs.com/haozhangcool/p/12271997.html
Copyright © 2020-2023  润新知