VTK+Qt使用BoxWidget包围盒对三维模型进行手动交互切割
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包围盒对三维模型进行手动交互切割相关推荐
- 【转】VTK + QT + VS 编译安装配置
VTK Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的 ...
- [Vcpkg] 通过vcpkg安装vtk[qt]教程
教程环境 操作系统:Microsoft Windows 10 专业版(版本:10.0.19042 N/A Build 19042) vcpkg版本:2021-01-13-d67989bce1043b9 ...
- VTK与Python实现机械臂三维模型可视化详解
三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...
- qt百度地图html,Qt的QWebChannel和JS、HTML通信/交互驱动百度地图
Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...
- **PCL:嵌入VTK/QT显示(Code^_^)
中国人真是太不知道分享了,看看这个老外的博客,启发性链接. http://www.pcl-users.org/ 1. 这个是可用的源代码: 原文:I saw a thread with links t ...
- python机械臂仿真_使用VTK与Python实现机械臂三维模型可视化
三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...
- qml c++函数 slot_浅析Qt(C++),QML与HTML之间的交互
写在前面 本文适合有一定Qt及HTML经验的人阅读. Qt(C++)和QML间交互 想要了解Qt(C++)和QML间的信息交互,就不得不提到Qt的信号与槽机制. 信号与槽 信号与槽是qt的特有信息传输 ...
- Qt中UI线程与子线程的交互
0.前言 GUI框架一般只允许UI线程操作界面组件,Qt也是如此.但我们的应用程序一般是多线程的,势必就涉及到UI线程与子线程的交互. 下面介绍常用的UI线程与子线程交互方式,并附上自己的Demo. ...
- QT 主线程和任务线程通过信号交互
因为 qt线程中如果执行ui操作是很容易死机的,而且是不知道那的错误,所以分开执行,通过信号交互,但有时ui线程的单个任务比较久,所以需要等些时间,下面直接上代码,以做备份 主要是从树中取出一堆文件路 ...
最新文章
- 数据仓库的未来 MariaDB ColumnStore
- 周志华 机器学习 笔记
- php判断http头还是https头
- eslint 无法格式化ts_VS Code Prettier + ESlint 格式化Vue代码及遇到问题
- 凝结时光:ImageMagick 制作 gif
- redis cli 删除key 模糊_不同操作系统下,Redis的使用命令
- 背景调查 跳槽_分享 | 录用背景调查,查的到底是什么?
- Java实现二叉树的前中后序遍历(Leetcode)
- mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!
- 对中级Linux用户有用的20个命令
- 本週主題 -- Jakarta Commons Lang
- Lync Server 2010迁移至Lync Server 2013部署系列 Part14:A/V服务器目录迁移
- Virtual KD 出现 Still cannot find RPC dispatcher table 无法连接
- 7.JUC 三大辅助类
- 硬件接口之audio接口
- 使用Excel中PPMT函数和IPMT函数进行等额本息还款的计算方法
- 详解LibraBFT共识机制
- 2019金九银十前端面经总结,java面试问题大全及答案大全word
- 解决Windows下移动硬盘无法弹出的问题:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf
- 肖特基二极管型号大全之ASEMI肖特基常见型号