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_交互与拾取_单位拾取相关推荐

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

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

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

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

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

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

  4. VTK:交互与拾取——单位拾取

    1.单位拾取 下面的代码 #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtk ...

  5. vue3.x +Cesium Cesium 鼠标交互,鼠标点击拾取对象等(五)

    cesium地图上鼠标点击事件 1.创建屏幕控制实例 var handlClick = new Cesium.ScreenSpaceEventHandler(window.viewer.canvas) ...

  6. 合作式智能运输系统 车用通信系统应用层及应用数据交互标准(第二阶段)_携手推进汽车与信息通信标准化融合发展,CSAE与CCSA签署标准化工作备忘录...

    2020年12月3日,中国汽车工程学会联合国家智能网联汽车创新中心在深圳举办了CSAE智能网联汽车V2X标准宣贯交流会.会上,中国汽车工程学会副秘书长.中国智能网联汽车产业创新联盟秘书长公维洁与中国通 ...

  7. 交互设计精髓_设计空间的精髓

    交互设计精髓 重点 (Top highlight) 什么是空间? (What is Space?) Space is the dimension of height, depth and width ...

  8. 合作式智能运输系统 车用通信系统应用层及应用数据交互标准 第二阶段_为什么一定要了解OPC UA TSN——未来的工业通信标准...

    ↑ 点击上方 "智能制造之家" 关注我们 写在面前 前面我们介绍了很多OPC UA的相关知识: OPC UA-面向未来的工业通讯规范 OPC UA服务器和客户端的安全机制你明白吗? ...

  9. java做度量衡换算器_单位换算计算器(度数换算计算器)

    有没有适合win7系统的单位换算器,可以推荐安装? 或是比较好用的在线换. import java.awt.event.*; import javax.swing.*; import java.awt ...

最新文章

  1. 性能:15个JavaScript本地存储技术的函数库和工具
  2. new/delete和malloc/free读书笔记
  3. CodeForces - 1438E Yurii Can Do Everything(暴力)
  4. Nginx SSL+tomcat集群配置SSL,ngnix配置SSL后js/css访问出现404
  5. 6个精心整理的资源网站,送给正在努力的你
  6. 技术需求趋势报告:移动、社会化、电子商务最热
  7. 滴滴试行“选择路线”功能 乘客可自主选择行驶路线
  8. linux内核:__user,__kernel,__safe,__force,__iomem
  9. Taro button点击切换选中状态
  10. 2018/4/7 Mybatis源码结构概览
  11. java 分卷 zip
  12. 3D开源游戏引擎(遵循BSD和MIT)
  13. 金山篡改浏览器主页问题(改成毒霸网址大全)
  14. 不重复的三位数python_Python趣味案例之不重复的三位数
  15. 【历史上的今天】6 月 30 日:冯·诺依曼发表第一份草案;九十年代末的半导体大战;CBS 收购 CNET
  16. 冷却塔为什么设计成双曲线型?
  17. 微信公众号wx.getlocation
  18. 计算机存储1pb等于多少kb,存储容量:1TB等于多少GB?1PB等于多少TB?1EB等于多少PB?
  19. 耳朵(一)Linux简述
  20. 求知若饥,虚心若愚 -- 乔布斯的三个故事

热门文章

  1. minio实现大文件分片上传+断点续传+预览
  2. C++ 打开文件夹对话框-OPENFILENAME
  3. 最新版Adobe2023:After Effects 2023(Ae2023) win/mac版中文特别版
  4. Swift学习笔记 (四十二) 不透明类型
  5. 【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
  6. eICIC和FeICIC
  7. PHP hypot,hypot - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  8. Netflow、Netstream、sflow
  9. Java毕业设计-会议室预约小程序系统
  10. 团员大会如何写组织学习计算机知识,团支部召开接收新团员的支部大会的会议记录怎么写?...