VTK_Learning_交互与拾取_单位拾取
1.单位拾取
示例代码:
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) 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类同样派生自vtkInteraTrackballCamera,并通过重载该函数类的OnLeftButtonDown()函数来处理鼠标左键消息。PolyData为被拾取的模型数据,需要通过外部设置。在响应鼠标左键消息时,首先定义vtkCellPicker对象,使用Pick()函数实现拾取功能。拾取完毕,即可通过GetCellId()函数来得到当前拾取的单元索取号。
为了更方便地显示拾取的结果,可实现单元边的高亮显示。这里就涉及了vtkPolyData的局部数据提取功能。实现该功能时使用了几个新的类。
- vtkIdTypeArray:对象存储当前选中的单位的索引号,每次只选取一个单元,因此每次该对象仅有一个索引号;
- vtkSelectedNode对象与vtkSelection对象通常搭配使用,vtkSelection实际上是一个vtkSelectionNode的数组,而vtkSelectionNode则声明了要提取的数据的类型,这里SetFiledType()设置数据的类型为单元,SeiContentType()设置数据的内容为索引号。
- vtkExtractSelection:实现了数据提取功能,其第一个输入为被提取的vtkPolyData,第二个输入为vtkSelection对象,标记要提取的数据类型。
提取完毕,即可将提取的结果保存至一个vtkActor对象,并添加至当前的vtkRenderer中显示。
VTK_Learning_交互与拾取_单位拾取相关推荐
- VTK修炼之道79:交互与拾取_单位拾取
1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...
- VTK_Learning_交互与拾取_点拾取
1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...
- VTK修炼之道78:交互与拾取_点拾取
1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...
- VTK:交互与拾取——单位拾取
1.单位拾取 下面的代码 #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtk ...
- vue3.x +Cesium Cesium 鼠标交互,鼠标点击拾取对象等(五)
cesium地图上鼠标点击事件 1.创建屏幕控制实例 var handlClick = new Cesium.ScreenSpaceEventHandler(window.viewer.canvas) ...
- 合作式智能运输系统 车用通信系统应用层及应用数据交互标准(第二阶段)_携手推进汽车与信息通信标准化融合发展,CSAE与CCSA签署标准化工作备忘录...
2020年12月3日,中国汽车工程学会联合国家智能网联汽车创新中心在深圳举办了CSAE智能网联汽车V2X标准宣贯交流会.会上,中国汽车工程学会副秘书长.中国智能网联汽车产业创新联盟秘书长公维洁与中国通 ...
- 交互设计精髓_设计空间的精髓
交互设计精髓 重点 (Top highlight) 什么是空间? (What is Space?) Space is the dimension of height, depth and width ...
- 合作式智能运输系统 车用通信系统应用层及应用数据交互标准 第二阶段_为什么一定要了解OPC UA TSN——未来的工业通信标准...
↑ 点击上方 "智能制造之家" 关注我们 写在面前 前面我们介绍了很多OPC UA的相关知识: OPC UA-面向未来的工业通讯规范 OPC UA服务器和客户端的安全机制你明白吗? ...
- java做度量衡换算器_单位换算计算器(度数换算计算器)
有没有适合win7系统的单位换算器,可以推荐安装? 或是比较好用的在线换. import java.awt.event.*; import javax.swing.*; import java.awt ...
最新文章
- 性能:15个JavaScript本地存储技术的函数库和工具
- new/delete和malloc/free读书笔记
- CodeForces - 1438E Yurii Can Do Everything(暴力)
- Nginx SSL+tomcat集群配置SSL,ngnix配置SSL后js/css访问出现404
- 6个精心整理的资源网站,送给正在努力的你
- 技术需求趋势报告:移动、社会化、电子商务最热
- 滴滴试行“选择路线”功能 乘客可自主选择行驶路线
- linux内核:__user,__kernel,__safe,__force,__iomem
- Taro button点击切换选中状态
- 2018/4/7 Mybatis源码结构概览
- java 分卷 zip
- 3D开源游戏引擎(遵循BSD和MIT)
- 金山篡改浏览器主页问题(改成毒霸网址大全)
- 不重复的三位数python_Python趣味案例之不重复的三位数
- 【历史上的今天】6 月 30 日:冯·诺依曼发表第一份草案;九十年代末的半导体大战;CBS 收购 CNET
- 冷却塔为什么设计成双曲线型?
- 微信公众号wx.getlocation
- 计算机存储1pb等于多少kb,存储容量:1TB等于多少GB?1PB等于多少TB?1EB等于多少PB?
- 耳朵(一)Linux简述
- 求知若饥,虚心若愚 -- 乔布斯的三个故事
热门文章
- minio实现大文件分片上传+断点续传+预览
- C++ 打开文件夹对话框-OPENFILENAME
- 最新版Adobe2023:After Effects 2023(Ae2023) win/mac版中文特别版
- Swift学习笔记 (四十二) 不透明类型
- 【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
- eICIC和FeICIC
- PHP hypot,hypot - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
- Netflow、Netstream、sflow
- Java毕业设计-会议室预约小程序系统
- 团员大会如何写组织学习计算机知识,团支部召开接收新团员的支部大会的会议记录怎么写?...