VTK系列——拾取点/显示当前点选点并删除上次的点选点

1 前言:vtkpick系列在《VTK图形图像开发进阶》一书中讲得非常详细;这里不再赘述,在实际项目中会遇到需要点选一个点标记出来,在下次选择另一个点的时候继续标记同时删除上一次的标记点。

2 代码:

class PointPickerInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
    static PointPickerInteractorStyle* New();
    vtkTypeMacro(PointPickerInteractorStyle, vtkInteractorStyleTrackballCamera)
    PointPickerInteractorStyle()
    {
        last_picked_actor=NULL;
       
    }
    virtual ~PointPickerInteractorStyle()
    {
       
    }
    virtual void OnRightButtonDown()
    {
        //打印鼠标左键像素位置
        if(this->Interactor->GetControlKey())
        {
            std::cout << "Picking pixel: " << this->Interactor->GetEventPosition()[0]
                      << " " << this->Interactor->GetEventPosition()[1] << std::endl;
            //注册拾取点函数
            this->Interactor->GetPicker()->Pick(
                        this->Interactor->GetEventPosition()[0],
                    this->Interactor->GetEventPosition()[1], 0,  // always zero.
                    this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()
                    );
            //打印拾取点空间位置
            this->Interactor->GetPicker()->GetPickPosition(picked);
            std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;
            //如果之前选择了其他点,删除上一次的标记点
            if(this->last_picked_actor)
            {
                this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->RemoveActor(last_picked_actor);
//                last_picked_actor->Delete();
//                last_picked_actor=vtkActor::New();
            }
	    //获取此次的标记点。
            this->last_picked_actor=GetActor();
            if(this->last_picked_actor)
            {
                //标记出来,
                this->last_picked_actor->SetScale(0.02);
                this->last_picked_actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
                this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(this->last_picked_actor);
            }
            vtkInteractorStyleTrackballCamera::OnRightButtonDown();

        }


    }
    int flag;
    double picked[3];//选取的点坐标
private:
    vtkActor* last_picked_actor;
    inline vtkActor* GetActor()
    {

        vtkSmartPointer<vtkSphereSource> sphereSource =
                vtkSmartPointer<vtkSphereSource>::New();
        sphereSource->Update();

        vtkSmartPointer<vtkPolyDataMapper> mapper =
                vtkSmartPointer<vtkPolyDataMapper>::New();
        mapper->SetInputConnection(sphereSource->GetOutputPort());
        vtkActor* actor = vtkActor::New();
        actor->SetMapper(mapper);
        actor->SetPosition(picked);
        return actor;
    }
};
3 参考文献 

VTK图形图像开发进阶

  http://blog.youkuaiyun.com/webzhuce/article/details/72802322


在Python中结合VTK库进行云操作时,你可以创建一个交互式的应用程序来实现鼠标拾取改变其颜色的功能。VTK (Visualization Toolkit) 提供了强大的图形渲染和数据处理能力,可以处理各种三维几何形状和数据。 首先,你需要安装必要的库,如numpy、matplotlib和pyvista。安装命令如下: ```bash pip install numpy matplotlib pyvista ``` 然后,你可以编写一个简单的脚本示例,利用`pyvista.PolyData`处理云,通过`iren.InteractorStyleTrackballCamera()`实现鼠标拾取: ```python import numpy as np import pyvista as pv from pyvistaqt import QtInteractor # 创建随机云数据 num_points = 1000 points = np.random.rand(num_points, 3) colors = np.random.rand(num_points, 3) # 创建云对象 polydata = pv.PolyData(points, colors=colors) # 创建交互窗口 interact = QtInteractor() plotter = pv.Plotter(off_screen=True) plotter.add_mesh(polydata, lighting=False) # 鼠标拾取事件处理器 def onclick(event): picked_point = plotter.pick(event.actor2d, event.position, ray_down=True) if picked_point is not None: picked_color = polydata.points[picked_point.point_id] # 修改颜色,这里仅示例,可以根据需要调整 polydata.colors[picked_point.point_id] = [1.0, 0.0, 0.0] # 红色 plotter.update() # 绑定击事件 plotter.on_click(onclick) # 开始交互 interact.show_interactor(plotter.ren) # 清理资源 interact.close() plotter.close() ``` 在这个例子中,当用户在云上击时,会触发`onclick`函数,该函数会找到被击的,然后改变该的颜色。运行此脚本后,你会看到一个窗口显示云,击即可改变的颜色。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值