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