码峰博客 – 码而思

分享积累从此时此刻开始

vtkInteractorStyleUser 自定义滚轮滚动时放大缩小图像

在使用 vtkInteractorStyleUser 自定义交互样式时,想要支持图像的放大缩小功能。
本想使用系统本身的放大缩小,但没有找到合适的方法,只能自己实现。思路就是监听滚轮滚动,然后使用 camera.Dolly 放大缩小图像,有两个问题
1. 图像放大画面会丢失
2. 滚动时间响应频繁,频繁处理会比较卡,因此增加定时处理防止频繁渲染
下面针对这两个问题进行修复


class MeasureStyle(vtk.vtkInteractorStyleUser):
    def __init__(self):
        super().__init__()

        # 定时器
        self.timer_id = None

        # 滚轮滚动处理
        self.AddObserver(vtkCommand.MouseWheelBackwardEvent,self.MouseWheel)
        self.AddObserver(vtkCommand.MouseWheelForwardEvent, self.MouseWheel)

    def MouseWheel(self, obj, event):
        """
        自定义滚轮滚动处理
        """
        # 获取滚轮移动方向
        if event == "MouseWheelBackwardEvent":
            self.direction = "Backward"
            # print("Mouse wheel backward (zoom out)")
        elif event == "MouseWheelForwardEvent":
            self.direction = "Forward"
            # print("Mouse wheel forward (zoom in)")

        # 定时器已存在,先清理
        if self.timer_id is not None:
            self.interactor.DestroyTimer(self.timer_id, event)
        # 设置一个定时器,例如 500 毫秒后执行 on_mouse_wheel_stop 方法
        self.timer_id = self.interactor.CreateRepeatingTimer(500)
        self.AddObserver(vtkCommand.TimerEvent, self.on_mouse_wheel_stop)


    def on_mouse_wheel_stop(self, obj, event):
        """
        滚动结束后,清理定时器,并对图像进行放大缩小
        """
        if self.timer_id is not None:
            print("Mouse wheel stopped scrolling")
            # 清除定时器
            self.interactor.DestroyTimer(self.timer_id, event)
            self.timer_id = None
            # 放大缩小
            renderer = self.GetCurrentRenderer()
            camera = renderer.GetActiveCamera()
            camera.Dolly(0.9 if self.direction == 'Forward' else 1.1)
            # 确保整个场景仍然可见
            renderer.ResetCameraClippingRange()
            self.interactor.Render()

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注