VTK+Qt三维可视化系列应用

第二篇 使用BoxWidget包围盒模拟平面切割


文章目录

  • VTK+Qt三维可视化系列应用
  • 前言
  • 一、载入模型
  • 二、添加裁切包围盒
  • 三、显示效果
  • 总结

前言

对STL模型的包围盒进行交互从而对模型的“切割”,加引号是因为其实只是设置了类似于摄像机的裁切平面,使视觉上只能看见包围盒内的一部分物体


一、载入模型

导入自定义的STL模型,是用3DBuilder随便画的,便于观察效果

主要代码:

    string fileName = "file.stl";vtkSmartPointer<vtkSTLReader>reader = vtkSTLReader::New();reader->SetFileName(fileName.c_str());reader->Update();m_sourcepolydata = reader->GetOutput();vtkSmartPointer<vtkStripper> stripper = vtkSmartPointer<vtkStripper>::New();stripper->SetInputConnection(reader->GetOutputPort());vtkSmartPointer<vtkPolyDataMapper> polydatamapper = vtkSmartPointer<vtkPolyDataMapper>::New();polydatamapper->SetInputConnection(stripper->GetOutputPort());actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(polydatamapper);actor->GetProperty()->SetOpacity(0.5);renderer->AddActor(actor);renderer->SetBackground(0.1,0.2,0.3);renderer->ResetCamera();vtkSmartPointer<vtkAxesActor>  Axes = vtkSmartPointer<vtkAxesActor>::New();        //加个坐标轴vtkOrientationMarkerWidget* widget = vtkOrientationMarkerWidget::New();widget->SetInteractor(interactor);widget->SetOrientationMarker(Axes);widget->SetOutlineColor(1, 1, 1);widget->SetViewport(0, 0, 0.2, 0.2);widget->SetEnabled(1);widget->InteractiveOff();

二、添加裁切包围盒

添加包围盒,包围盒就是模型的最小包围立方体,在包围盒每个面的中间有操作点,拖动操作点即可调整模型的裁切平面

核心代码:

m_box = vtkSmartPointer<View3D>::New();
m_box->SetInteractor(interactor);
m_box->SetRenderer(renderer);
m_box->SetPolyData(m_sourcepolydata);
m_box->SetActor(actor);
m_box->Start();

其中View3D是交互类,用于响应每次拖动控制点后的事件并将拖动的平面参数传给VtkBoxWidget类,VtkBoxWidget继承自vtk3DWidget,对其中的一些事件进行了重写,主要包围盒的显示和交互相关。部分核心代码如下:

#include "vtkCallbackCommand.h"
#include "vtkObject.h"
#include "vtkSmartPointer.h"
#include "vtkboxwidget.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkPolyData.h"
#include "vtkActor.h"
#include "vtkMapper.h"class View3D :public vtkObject
{public:
static View3D* New(){return new View3D();}View3D(void);~View3D(void);void Start();//从主函数传参void SetInteractor(vtkRenderWindowInteractor* interactor){m_Interactor = interactor;}void SetRenderer(vtkSmartPointer<vtkRenderer> renderer){m_Renderer = renderer;}void SetPolyData(vtkPolyData *p){m_polydata = p;}void SetActor(vtkSmartPointer<vtkActor> actor){m_Actor = actor;}void SetResourceColor(std::string name,double &r,double &g,double &b,double &opacity); //设置包围盒相关颜色void OnBoxWidgetEndEvent();static void ProcessEvent(vtkObject* p,unsigned long n,void* clientdata,void* calldata);//处理交互事件vtkSmartPointer<VtkBoxWidget>         m_BoxWidget;   //包围盒类vtkSmartPointer<vtkCallbackCommand>   m_Callback;vtkSmartPointer<vtkRenderer> m_Renderer;vtkRenderWindowInteractor* m_Interactor;vtkSmartPointer<vtkActor> m_Actor;vtkPolyData * m_polydata;
};

三、显示效果



虽然不是真实裁切,但是视觉效果很好啦,再结合上一篇进行改进,也可以得到真实的切割数据

总结

该裁切方法主要在于交互的设计,所谓裁切工作其实是vtkMapper->SetClippingPlanes(vtkpalne*)方法完成的,关键在于正确传递vtkplane

VTK+Qt使用BoxWidget包围盒对三维模型进行手动交互切割相关推荐

  1. 【转】VTK + QT + VS 编译安装配置

    VTK Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的 ...

  2. [Vcpkg] 通过vcpkg安装vtk[qt]教程

    教程环境 操作系统:Microsoft Windows 10 专业版(版本:10.0.19042 N/A Build 19042) vcpkg版本:2021-01-13-d67989bce1043b9 ...

  3. VTK与Python实现机械臂三维模型可视化详解

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

  4. qt百度地图html,Qt的QWebChannel和JS、HTML通信/交互驱动百度地图

    Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...

  5. **PCL:嵌入VTK/QT显示(Code^_^)

    中国人真是太不知道分享了,看看这个老外的博客,启发性链接. http://www.pcl-users.org/ 1. 这个是可用的源代码: 原文:I saw a thread with links t ...

  6. python机械臂仿真_使用VTK与Python实现机械臂三维模型可视化

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

  7. qml c++函数 slot_浅析Qt(C++),QML与HTML之间的交互

    写在前面 本文适合有一定Qt及HTML经验的人阅读. Qt(C++)和QML间交互 想要了解Qt(C++)和QML间的信息交互,就不得不提到Qt的信号与槽机制. 信号与槽 信号与槽是qt的特有信息传输 ...

  8. Qt中UI线程与子线程的交互

    0.前言 GUI框架一般只允许UI线程操作界面组件,Qt也是如此.但我们的应用程序一般是多线程的,势必就涉及到UI线程与子线程的交互. 下面介绍常用的UI线程与子线程交互方式,并附上自己的Demo. ...

  9. QT 主线程和任务线程通过信号交互

    因为 qt线程中如果执行ui操作是很容易死机的,而且是不知道那的错误,所以分开执行,通过信号交互,但有时ui线程的单个任务比较久,所以需要等些时间,下面直接上代码,以做备份 主要是从树中取出一堆文件路 ...

最新文章

  1. 数据仓库的未来 MariaDB ColumnStore
  2. 周志华 机器学习 笔记
  3. php判断http头还是https头
  4. eslint 无法格式化ts_VS Code Prettier + ESlint 格式化Vue代码及遇到问题
  5. 凝结时光:ImageMagick 制作 gif
  6. redis cli 删除key 模糊_不同操作系统下,Redis的使用命令
  7. 背景调查 跳槽_分享 | 录用背景调查,查的到底是什么?
  8. Java实现二叉树的前中后序遍历(Leetcode)
  9. mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!
  10. 对中级Linux用户有用的20个命令
  11. 本週主題 -- Jakarta Commons Lang
  12. Lync Server 2010迁移至Lync Server 2013部署系列 Part14:A/V服务器目录迁移
  13. Virtual KD 出现 Still cannot find RPC dispatcher table 无法连接
  14. 7.JUC 三大辅助类
  15. 硬件接口之audio接口
  16. 使用Excel中PPMT函数和IPMT函数进行等额本息还款的计算方法
  17. 详解LibraBFT共识机制
  18. 2019金九银十前端面经总结,java面试问题大全及答案大全word
  19. 解决Windows下移动硬盘无法弹出的问题:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf
  20. 肖特基二极管型号大全之ASEMI肖特基常见型号

热门文章

  1. Maya使用动力学曲线驱动骨骼
  2. 销售易crm虚拟位置_释放CRM和虚拟电话集成的潜力
  3. 超声波探伤器上位机设计
  4. gitlab查看用户id
  5. HTML常用快捷键都在这了 看完之后效率暴涨
  6. canvas画八卦图
  7. 西门子PLC与威伦通触摸屏HMI学习指导
  8. 生物素修饰核壳结构上转换纳米粒(808激发,蓝光)
  9. 软件测试人员必备的32个网站清单,果断收藏了
  10. SDN你必须知道的十大问题——SDN明星级研究团队