VTK——设置交互样式上的鼠标回调函数

函数介绍

VTKPointPickerInteractorStyle是一个自定义的交互样式类,它是VTK库中vtkInteractorStyleTrackballCamera类的子类。VTK(Visualization Toolkit)是一个开源的,跨平台的库,用于处理、渲染和视觉化科学数据。它包括一系列的类和方法用于3D计算机图形、图像处理和可视化。

vtkInteractorStyleTrackballCamera是VTK中的一个交互样式类,它定义了用户与3D场景交互的方式,例如:旋转、缩放、平移等。VTKPointPickerInteractorStyle类继承了vtkInteractorStyleTrackballCamera类,并重写了一些方法,以自定义用户的交互行为。

cpp 复制代码
class VTKPointPickerInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
    static VTKPointPickerInteractorStyle* New();
    vtkTypeMacro(VTKPointPickerInteractorStyle, vtkInteractorStyleTrackballCamera);

    void setObjectIndex(int index) { m_index = index; }
    int getObjectIndex() const { return m_index; }
    VTKPointPickerInteractorStyle()
    {
        LastPickedActor = NULL;
        LastPickedProperty = vtkProperty::New();
    }
    virtual ~VTKPointPickerInteractorStyle()
    {
        LastPickedProperty->Delete();
    }
    virtual void OnLeftButtonUp() override
    {
        // Forward events
        vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
    }
    virtual void OnLeftButtonDown() override
    {
        int* clickPos = this->GetInteractor()->GetEventPosition();
        this->Interactor->GetPicker()->Pick(clickPos[0], clickPos[1], 0,  // always zero.
                                            this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());

        double picked[3];
        this->Interactor->GetPicker()->GetPickPosition(picked);
//        std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;

        // Forward events
        vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
    }
//    virtual void OnMouseMove() override
//    {

//    }

private:
    vtkActor    *LastPickedActor;
    vtkProperty *LastPickedProperty;
    int m_index;

};

被重写的方法还能保留之前的功能吗?重写一个方法会完全覆盖父类中的该方法的实现。但是,可以在子类的方法中显式调用父类的方法来保留父类的功能。

例如,在VTKPointPickerInteractorStyle类的OnLeftButtonDown方法中,在方法的最后,调用了vtkInteractorStyleTrackballCamera::OnLeftButtonDown()。这样,就可以在执行完VTKPointPickerInteractorStyle类的OnLeftButtonDown方法的自定义操作后,再执行vtkInteractorStyleTrackballCamera类的OnLeftButtonDown方法。这样做可以保证在执行完子类的自定义操作后,还能执行父类的操作。

设置回调

下面是用于设置回调,同时为了在鼠标点击窗口时确认当前窗口索引,将每个窗口的索引或objectName存储在类的某个成员变量中,并添加一个方法来检索它。

cpp 复制代码
class VTKPointPickerInteractorStyle : public vtkInteractorStyleTrackballCamera
{
    ...
public:
    void setObjectIndex(int index) { m_index = index; }
    int getObjectIndex() const { return m_index; }
    ...
private:
    int m_index;
};

然后在创建VTKPointPickerInteractorStyle对象时设置索引i。

cpp 复制代码
    for(int i=0;i<8;i++){
    vtkSmartPointer<VTKPointPickerInteractorStyle> style =
        vtkSmartPointer<VTKPointPickerInteractorStyle>::New();
        style->setObjectIndex(i);

        render[i]->GetInteractor()->SetInteractorStyle(style);
    }
    

将交互样式设置为 nullptr,也就是清除交互样式,回到默认的交互方法。

cpp 复制代码
render[i]->GetInteractor()->SetInteractorStyle(nullptr);
相关推荐
2601_956121976 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-8 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
小星星闪亮登场10 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑10 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶10 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ11 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海12 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Henry Zhu12313 小时前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
June`16 小时前
warp shuffle指令
c++·人工智能·算法·cuda
乱七八糟的屋子16 小时前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray