如何在VTK选择器Actor中保留旋转与拖拽交互功能?
解决VTK交互器旋转和拖拽功能禁用的问题
嘿,我看你遇到的问题是自定义VTK交互器后,原本的旋转、拖拽功能失效了对吧?这其实是因为你重写OnLeftButtonDown方法的时候,没有调用父类的同名方法,导致父类负责处理的核心交互逻辑没被执行。
咱们先理清楚:vtkInteractorStyleTrackballActor的OnLeftButtonDown方法里已经实现了选中Actor后的旋转、拖拽逻辑,所以咱们在自定义方法里必须先调用父类的这个方法,再添加自己的业务逻辑(比如打印选中Actor的高度)。
修改后的完整代码如下:
// 处理鼠标事件 class MouseInteractorStyle5 : public vtkInteractorStyleTrackballActor { public: static MouseInteractorStyle5* New(); vtkTypeMacro(MouseInteractorStyle5, vtkInteractorStyleTrackballActor); virtual void OnLeftButtonDown() { // 先调用父类的方法,保留旋转、拖拽等原生交互功能 vtkInteractorStyleTrackballActor::OnLeftButtonDown(); // 接下来添加你自己的选中Actor并打印高度的逻辑 vtkSmartPointer<vtkPropPicker> picker = vtkSmartPointer<vtkPropPicker>::New(); int* clickPos = this->GetInteractor()->GetEventPosition(); picker->Pick(clickPos[0], clickPos[1], 0, this->GetDefaultRenderer()); // 获取选中的Actor vtkActor* selectedActor = vtkActor::SafeDownCast(picker->GetActor()); if (selectedActor) { // 获取Actor的高度(这里取边界盒的上下方向差值作为高度) double bounds[6]; selectedActor->GetBounds(bounds); double height = bounds[5] - bounds[4]; std::cout << "选中Actor的高度为:" << height << std::endl; } } }; vtkStandardNewMacro(MouseInteractorStyle5);
关键说明:
- 一定要先调用
vtkInteractorStyleTrackballActor::OnLeftButtonDown();,这一步会触发父类的交互逻辑,保证旋转、拖拽功能正常工作。 - 之后再执行你自己的拾取和打印高度的逻辑,这样既保留了原生交互,又实现了自定义功能。
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

