VTK:交互与拾取——点拾取
1.拾取
拾取最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时候需要用鼠标来选择所要控制的角色,这时候要用到拾取功能。
另外,在某些三维图形图形的编译软件中,经常需要编辑其中的一个点,一个片面或者一个局部区域,这也需要通过拾取功能来完成。
多个拾取功能:
VTK中所有的拾取类都继承自vtkAbstractPicker类,在这些类的基础上可以实现非常复杂的功能。
2.点拾取
完成点拾取功能的类是vtkPointPicker。
vtk中的消息是通过vtkRenderWindowInteractor类处理的,在类vtkRenderWindowInteractor中,定义如下函数:
virtual void SetPicker(vtkAbstractPicker* );
该函数用来设置具体的VTKAbstractPicker对象,并执行相应的拾取操作。因此对于点拾取,实际就是设置VTKPointPicker的过程。
比如拾取某个点时,应该响应鼠标的左键按下消息,并在响应该消息的函数中根据鼠标的当前窗口坐标来完成拾取操作。
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkInteractionStyle)#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>#include <vtkPointPicker.h>
//this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()
#include <vtkRendererCollection.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkObjectFactory.h> //vtkStandardNewMacro();
#include <vtkProperty.h>#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>
/**************************************************************************************************/
class PointPickerInteractorStyle : public vtkInteractorStyleTrackballCamera
{public:static PointPickerInteractorStyle* New();vtkTypeMacro(PointPickerInteractorStyle, vtkInteractorStyleTrackballCamera);virtual void OnLeftButtonDown(){//打印鼠标左键像素位置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());//打印拾取点空间位置double picked[3];this->Interactor->GetPicker()->GetPickPosition(picked);std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;//对拾取点进行标记vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(sphereSource->GetOutputPort());vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->SetPosition(picked);actor->SetScale(0.05);actor->GetProperty()->SetColor(1.0, 0.0, 0.0);this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor);vtkInteractorStyleTrackballCamera::OnLeftButtonDown();}
};
/**************************************************************************************************/vtkStandardNewMacro(PointPickerInteractorStyle);int main()
{vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(sphereSource->GetOutputPort());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetBackground(1, 1, 1);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->Render();renderWindow->SetWindowName("PointPicker");renderWindow->AddRenderer(renderer);vtkSmartPointer<vtkPointPicker> pointPicker =vtkSmartPointer<vtkPointPicker>::New();vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetPicker(pointPicker);renderWindowInteractor->SetRenderWindow(renderWindow);vtkSmartPointer<PointPickerInteractorStyle> style =vtkSmartPointer<PointPickerInteractorStyle>::New();renderWindowInteractor->SetInteractorStyle(style);//vtkSmartPointer<vtkAxesActor> Axes = vtkSmartPointer<vtkAxesActor>::New();vtkSmartPointer<vtkOrientationMarkerWidget> widget =vtkSmartPointer<vtkOrientationMarkerWidget>::New();widget->SetInteractor(renderWindowInteractor);widget->SetOrientationMarker(Axes);widget->SetOutlineColor(1, 1, 1);widget->SetViewport(0, 0, 0.2, 0.2);widget->SetEnabled(1);widget->InteractiveOn();renderWindow->Render();renderWindowInteractor->Start();return 0;
}
- vtkInteractorStyleTrackballCemera派生类设计;
PointPickerInteractorStyleTrackllCemera派生,并覆盖了该类OnLeftButtonDown()函数。在该函数中,调用了vtkRenderWindowInteractor的GetEventPosition()函数输出鼠标点击的屏幕坐标。 - 拾取函数Pick()设计;int Pick(double selectionX, double selectionY, double selectionZ, vtkRender* renderer);
该函数需要接受四个参数,前三个为(selectionX,selectionY,selectionZ),即鼠标的当前窗口坐标,其中selectionZ通常为零。最后一个是vtkRenderer对象。 - GetPackPosition()是指世界坐标系下拾取点的坐标
- mian()函数中设计拾取调用流程`vtkSmartPointer pointPicker =
vtkSmartPointer::New();
vtkSmartPointer renderWindowInteractor =
vtkSmartPointer::New();
renderWindowInteractor->SetPicker(pointPicker);
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkSmartPointer style =
vtkSmartPointer::New();
renderWindowInteractor->SetInteractorStyle(style);`
VTK:交互与拾取——点拾取相关推荐
- VTK:交互与拾取——单位拾取
1.单位拾取 下面的代码 #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtk ...
- 我的世界服务器怎么设置自动拾取,自动拾取Auto Pickup Mod
作者:Furgl 链接:官网 自动拾取Mod让你在挖取资源的时候,自动将资源存储到你的背包中.在方块被挖出的时候,不会掉落到地上,取而代之的是,直接进入到你的背包中. 这种方式,让收集物品的效率更高, ...
- VTK交互系统 1 交互模式入门
在VTK中,交互一般使用 命令/观察者模式来进行交互,即观察者等待命令,一旦有命令触发,就去执行该交互函数. 有两种实现模式: 1. 设置回调函数 2. 继承command类,然后实现内部函数 我 ...
- VTK交互系统 2 交互器样式
所谓交互器样式,就是你设置了交互器,然后它里面会有各种默认的或者你自己定义的交互方式,比如你可以设置滚轮来将图片放大或者缩小.或者你可以设置鼠标点击移动来改变摄像机的视角,从而看到物体的不同面. VT ...
- php 调用 坐标拾取,坐标拾取 · thinkphp5学习笔记 · 看云
腾讯坐标拾取,一当前位置为中心: ~~~ 传递事件参数 window.addEventListener('message', function(event) { // 接收位置信息 var loc = ...
- VTK修炼之道78:交互与拾取_点拾取
1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...
- VTK_Learning_交互与拾取_点拾取
1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...
- SteamVR 2.x 手柄拾取3D物体(13)
在实际项目过程中,触碰和拾取物体是最常用的功能之一,本章介绍手柄拾取物体的交互. 一.前期准备 新建场景,删除默认相机,将Player拖拽进入场景内 新建Plane,修改为Floor,上一个黑色材质球 ...
- VTK修炼之道77:交互部件_分割/配准类Widget与其他Widget
1.分割/配准交互部件 图像分割与配准是数字图像处理技术两大主要的应用领域,特别是在医学图像处理中. 著名的医学图像分割与配准工具包ITK(Insight Segmentation & Reg ...
最新文章
- linux查询重复数据库,Linux如何使用locate命令查找数据搜索数据库
- SAP WM 物料主数据里的Palletization Data
- SanDisk闪迪推面向VMware Virtual SAN 6的增强型闪存
- c# DllImport 错误处理的不足及解决办法
- pycharm 报错 IndentationError: unexpected unindent 解决办法
- Text Storage table
- SoapUI笔记-使用SoapUI测试WebService服务端
- python优先级排序_用Python实现优先级队列的3种方法
- kafka实战教程(python操作kafka),kafka配置文件详解
- 数据库系统实现 第一章 DBMS实现概述
- unity webPlayer
- IDEA远程调试代码
- Mysql语句字符串拼接
- 平面上两直线的夹角求法解析
- 程序猿学习中华古诗词路径
- itextpdf解决PDF合并的问题
- 关于登陆百度等网站显示‘’隐私设置错误”的问题
- Java IO有这么难吗?
- 嵌入式BootLoader技术内幕(一)
- 台式计算机睡眠状态耗电多吗,台式机的休眠状态下还耗电吗?
热门文章
- 2022危险化学品经营单位安全管理人员特种作业证考试题库模拟考试平台操作
- R语言中导入excel乱码的解决办法
- r导入txt乱码_R中导入excel乱码的解决办法
- Flutter iOS问题记录 - Fastlane打包的ipa包上传fir后不显示应用版本名称
- 登陆和登录,login
- rpm包安装linux系统,包管理 ----- Linux操作系统rpm包安装方式步骤
- 使用Python绘制移动均线
- html5文本溢出应该怎么处理?
- Java关键字详解this、private、static、super、extends继承、instanceof、final、abstract、interface、implements、enum...
- 洛谷【P1873】 砍树 简单二分解析