• vtk拾取器-vtkAbstractPicker/vtkCellPicker


    很高兴在雪易的CSDN遇见你 ,给你糖糖

    欢迎大家加入雪易社区-CSDN社区云 


    前言

            本文分享VTK中vtkCellPicker技术,主要从vtkCellPicker的继承关系、vtkCellPicker的实现原理和具体在实践中的用法方面详细展开,助力小伙伴掌握vtkCellPicker用法,并且能够深刻理解应应用于自己的项目中。

    感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

    你的点赞就是我的动力(^U^)ノ~YO


    我将收获到的:

            1. vtkCellPicker的实现原理

            2. vtkCellPicker获取Actor的方法

            3. vtkCellPicker获取线、点的方法

    目录

    前言

    我将收获到的:

    vtkCellPicker继承关系

    vtkCellPicker父类vtkAbstractPicker

    vtkCellPicker父类vtkAbstractPropPicker

    vtkCellPicker 

    》实现原理

    》vtkCellPicker用法

    结论:


    vtkCellPicker继承关系

    vtkCellPicker父类vtkAbstractPicker

            描述:vtkAbstractPicker是vtk拾取器的基类,为其子类提供最基础的功能-返回Pick点的全局坐标(主要通过Pick()和GetPickPosition() 两个方法)。

            用法:

    1. vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::SafeDownCast(caller);
    2. int screenPosition[3];
    3. interactor->GetEventPosition(screenPosition);
    4. vtkNew picker;
    5. picker->Pick(screenPosition[0], screenPosition[1], 0,
    6. interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
    7. double picked[3];
    8. picker->GetPickPosition(picked);

            vtkAbstractPicker还提供了限制拾取的功能,用法如下:

    1. vtkAbstractPicker* picker = vtkCellPicker::New();
    2. picker->SetTolerance(0.01);
    3. picker->AddPickList(this->LineActor);
    4. picker->PickFromListOn();

            详见:VTK--vtkCellPicker选择线段/点的方法_雪易的博客-CSDN博客

    注意:

    1. 当vtkProp设置为“unpickable”时,vtkAbstractPicker及其子类不能拾取。当透明度为0,即全透明时,vtkAbstractPicker及其子类也不能拾取。

    2. vtk中的拾取器分为两类:一类是通过几何方法获取(该方法可获取的信息更多,但速度较慢),另一类是通过渲染器获取(该类获取的信息较少,但速度较快)。

            几何拾取器为vtkPicker,vtkCellPicker,vtkPointPicker

            渲染拾取器为vtkWorldPointPicker,vtkPropPicker

    3. vtkPropPicker拾取的为vtkProp的实例。vtkCellPicker/vtkPointPicker可以拾取Cell和Point信息。vtkWorldPointPicker是最快的拾取器,返回x,y,z坐标值。vtkPicker可以拾取3DProp的BoundingBox。

    vtkCellPicker父类vtkAbstractPropPicker

    vtkAbstractPropPicker是拾取vtkProp实例的基类。当拾取动作触发后,通过vtkAssemblyPath的形式返回拾取的vtkProp。

    vtkAssemblyPath简单地理解为包括vtkAssemblyNode的顺序列表,每一个结点含有一个指向vtkProp对象的指针以及一个可选的vtkMatrix4x4对象。列表的顺序很重要。列表的起点是根节点即Assembly层次结构的顶层结点。列表的结尾表示Assembly层次结构的叶结点。结点的顺序会影响到与之关联的矩阵。每个矩阵是列表里结点Prop所对应的矩阵与前一个矩阵的级联。

    注意:

    1. 一个vtkProp可以被放置在不同的Assembly里,也可以放置在同一个Assembly的不同叶结点。vtk采用vtkAssemblyPath完全限定拾取的是哪个vtkProp,包含了vtkProp的位置信息。

    vtkCellPicker 

    》实现原理

            vtkCellPicker通过向3D场景中发射一条射线,并返回关于射线击中的第一个对象的信息。它作用的对象为所有的Prop3Ds。

            》对于vtkVolume对象,通过向volume发射一条射线,并返回光线与所选不透明度等值面的交点。

            》对于vtkImage对象,返回光线与显示Slice的交点。

            》对于vtkActor对象,返回光线与Actor的多边形的交点。

            》若对象的Mapper包含ClippingPlanes,也会将Clipping计算在内,会返回与光线相交的ClippingPlane的Id。

            》对于所有的Porp对象,返回Point和Cell信息,以及Surface在Pick位置的法向信息。

            》对于volume和image对象,还可以返回Pick位置的i,j,k坐标和选择的Cell。

    》vtkCellPicker用法

    1. vtkNew picker;
    2. picker->Pick(screenPosition[0], screenPosition[1], 0,
    3. interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
    4. double picked[3];
    5. picker->GetPickPosition(picked);
    6. //1. 获取Prop
    7. vtkProp* prop = picker->GetViewProp();
    8. //2. 获取CellID
    9. vtkIdType pickingIdx = picker->GetCellId();
    10. //3. 获取Surface的法向量
    11. double* normal = picker->GetPickNormal();
    12. //4. 获取图像数据
    13. int* mouse = picker->GetCellIJK();

    》vtkCellPicker获取线段/点的用法

             详见:VTK--vtkCellPicker选择线段/点的方法_雪易的博客-CSDN博客

    》vtkCellPicker限制选择对象

            也可通过上述选择线段/点钟的用法。


    结论:

    本文主要介绍了vtkCellPicker的常见用法!

    感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

    你的赞赏是我的最最最最大的动力(^U^)ノ~YO

  • 相关阅读:
    咖啡赛道1个月6起新融资,该不该投?投融资另类数据深度解析
    【Harmony OS】【JAVA UI】abilitySlice和ability跳转方式
    linux /proc进程文件目录介绍
    Rust生态系统:探索常用的库和框架
    探索RocketMQ中的分布式事务消息:原理与实践
    Elasticsearch倒排索引(二)深入Term Index(待补图)
    修复dinput8.dll文件的缺失,以及修复dinput8.dll文件时需要注意什么
    Redis 中 redis-benchmark 详解及参数介绍
    DFS - 常见算法题总结
    C++文件 I/O操作
  • 原文地址:https://blog.csdn.net/qq_40041064/article/details/127898439