1.单位拾取

下面的代码

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkDataSetMapper.h>
#include <vtkCellPicker.h>
#include <vtkSelectionNode.h>
#include <vtkSelection.h>
#include <vtkRendererCollection.h>
#include <vtkExtractSelection.h>
#include <vtkObjectFactory.h>/**************************************************************************/class CellPickerInteractorStyle :public vtkInteractorStyleTrackballCamera
{public:static CellPickerInteractorStyle* New();CellPickerInteractorStyle(){selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();selectedActor = vtkSmartPointer<vtkActor>::New();}virtual void OnLeftButtonDown(){int* pos = this->GetInteractor()->GetEventPosition();vtkSmartPointer<vtkCellPicker> picker =vtkSmartPointer<vtkCellPicker>::New();picker->SetTolerance(0.0005);picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());if (picker->GetCellId() != -1){vtkSmartPointer<vtkIdTypeArray> ids =vtkSmartPointer<vtkIdTypeArray>::New();ids->SetNumberOfComponents(1);ids->InsertNextValue(picker->GetCellId());vtkSmartPointer<vtkSelectionNode> selectionNode =vtkSmartPointer<vtkSelectionNode>::New();selectionNode->SetFieldType(vtkSelectionNode::CELL);selectionNode->SetContentType(vtkSelectionNode::INDICES);selectionNode->SetSelectionList(ids);vtkSmartPointer<vtkSelection> selection =vtkSmartPointer<vtkSelection>::New();selection->AddNode(selectionNode);vtkSmartPointer<vtkExtractSelection> extractSelection =vtkSmartPointer<vtkExtractSelection>::New();extractSelection->SetInputData(0, polyData);extractSelection->SetInputData(1, selection);extractSelection->Update();selectedMapper->SetInputData((vtkDataSet*)extractSelection->GetOutput());selectedActor->SetMapper(selectedMapper);selectedActor->GetProperty()->EdgeVisibilityOn();selectedActor->GetProperty()->SetEdgeColor(1, 0, 0);selectedActor->GetProperty()->SetLineWidth(3);this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);}vtkInteractorStyleTrackballCamera::OnLeftButtonDown();}
private:vtkSmartPointer<vtkPolyData>      polyData;vtkSmartPointer<vtkDataSetMapper> selectedMapper;vtkSmartPointer<vtkActor>         selectedActor;
};/*********************************************************************************/vtkStandardNewMacro(CellPickerInteractorStyle);int main()
{vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(sphereSource->GetOutput());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->GetProperty()->SetColor(0, 1, 0);actor->SetMapper(mapper);vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetBackground(1, 1, 1);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->Render();rw->SetWindowName("CellPicker Interaction");rw->AddRenderer(renderer);vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);/****************************************************************************/vtkSmartPointer<CellPickerInteractorStyle> style =vtkSmartPointer<CellPickerInteractorStyle>::New();style->SetDefaultRenderer(renderer);//style->polyData = sphereSource->GetOutput();rwi->SetInteractorStyle(style);rw->Render();rwi->Initialize();rwi->Start();return 0;
}

CellPickerInteractorStyle类同样派生于VR看InteraTrackballCamera,并通过重载该函数类的OnLeftButtonDown()函数来处理鼠标左键消息。PolyData:被拾取模型数据,需要通过外部设置。在响应鼠标左键消息时,首先定义vtkCellPicker对象,使用Pick()函数实现拾取。拾取完毕后,即可通过GetCellId()函数来得到当前拾取的单元索取号。
为了方便地显示拾取结果,可实现单元边的高亮显示。vtkPolyData的局部数据提取功能。实现该功能时,使用了几个新的类。

  • vtkTypeArray:对象存储当前选中的单位的索引号,每次只选取一个单元,因此每次该对象仅有一个索引号;
  • vtkSelectedNode对象与vtkSelection对象通常搭配使用,vtkSelection实际上是一个vtkSelectionNode的数组,而vtkSelectionNode则声明了要提取的数据的类型,这里SetFiledType()设置数据的类型为单元,SetContentType()设置数据的内容为索引号。
  • vtkExtractSelection:实现数据的提取功能,其第一个输入为被提取的vtkPolyData,第二个输入为vtkSelection对象,标记要提取的数据类型。
  • 提取完后,既可将提取的结果保存至一个vtkActor对象,并添加至当前的vtkRenderer中显示。

VTK:交互与拾取——单位拾取相关推荐

  1. VTK修炼之道79:交互与拾取_单位拾取

    1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...

  2. VTK_Learning_交互与拾取_单位拾取

    1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...

  3. VTK:交互与拾取——点拾取

    1.拾取 拾取最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时候需要用鼠标来选择所要控制的角色,这时候要用到拾取功能. 另外,在某些三维图形图形的编译软件中,经常需要编辑其中的一个点, ...

  4. 我的世界服务器怎么设置自动拾取,自动拾取Auto Pickup Mod

    作者:Furgl 链接:官网 自动拾取Mod让你在挖取资源的时候,自动将资源存储到你的背包中.在方块被挖出的时候,不会掉落到地上,取而代之的是,直接进入到你的背包中. 这种方式,让收集物品的效率更高, ...

  5. VTK交互系统 1 交互模式入门

    在VTK中,交互一般使用 命令/观察者模式来进行交互,即观察者等待命令,一旦有命令触发,就去执行该交互函数. 有两种实现模式: 1. 设置回调函数   2. 继承command类,然后实现内部函数 我 ...

  6. VTK交互系统 2 交互器样式

    所谓交互器样式,就是你设置了交互器,然后它里面会有各种默认的或者你自己定义的交互方式,比如你可以设置滚轮来将图片放大或者缩小.或者你可以设置鼠标点击移动来改变摄像机的视角,从而看到物体的不同面. VT ...

  7. php 调用 坐标拾取,坐标拾取 · thinkphp5学习笔记 · 看云

    腾讯坐标拾取,一当前位置为中心: ~~~ 传递事件参数 window.addEventListener('message', function(event) { // 接收位置信息 var loc = ...

  8. VTK修炼之道78:交互与拾取_点拾取

    1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...

  9. VTK_Learning_交互与拾取_点拾取

    1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...

最新文章

  1. 正在通过iTunes Store 进行鉴定
  2. MS SQL数据库服务介绍
  3. Jenkins设置用户权限
  4. 北风设计模式课程---深入理解[代理模式]原理与技术
  5. 特征工程(3):特征选择—信息增益
  6. 关于计算机三个人的英语对话,关于三个人的英语对话
  7. 别再无聊地吹捧了,一起来动手实现MAE玩玩吧!
  8. Linux 图片传输功能c/c++(初版)
  9. 在数据采集器中用TensorFlow进行实时机器学习
  10. 今天给组员找bug有感。
  11. 免费的数据恢复软件 恢复丢失的数据
  12. 在ubuntu 64位的机器上执行arm-linux-gcc提示 no such file or directory
  13. Java SSM 商户管理系统 客户管理 库存管理 销售报表 项目源码
  14. 射频电路设计——射频器件基础
  15. 【供应链案例】解密可口可乐供应链管理策略,揭头部饮料企业成功之道
  16. 维护机房服务器工作,机房维护(服务器搬迁方案).doc
  17. 京东在线客服话术汇总!
  18. 中国排名前100的IT公司及中国通信企业综合实力50强(转)
  19. 攻防世界 reverse reverse-for-the-holy-grail-350
  20. 学编程能做什么工作 五大行业任你选

热门文章

  1. 创建一个简单的后台教务管理系统,包含动态增删改查学生,年级和课程信息及查看登录日志等功能,包含表单验证.
  2. python配置(二)——机器学习环境
  3. oracle 索引快速全扫描,使用目录快速全扫描(Index FFS)避免全表扫描的若干场景
  4. C语言中从字符串中提取数字
  5. 33省市出台区块链专项政策,有地方拿户口、百万奖金抢人
  6. 在树莓派中Linux环境下rpm包的安装
  7. 黄花城之行-未到四海
  8. 网易考拉API开发系列:item_get-根据ID取商品详情 API 返回值说明
  9. C语言中的这些经典题目你都会了吗?【一文带你回顾经典】【全程高能】
  10. 软路由自建iptv服务器,LEDE软路由 iPTV 实现任意端口看电视的方法