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

2 篇文章 4 订阅

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

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



前言

对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

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
VTK是Visualization Toolkit的缩写,是一个开源的图形处理工具库,用于创建、处理和渲染三维图形。它提供了丰富的功能,可以用于各种应用程序,包括科学可视化、医学图像处理、机器人学等。 Qt是一种跨平台的应用程序开发框架,具有丰富的GUI(图形用户界面)组件和工具,可以用于创建各种类型的应用程序。它提供了直观、交互式的界面设计工具,使开发人员能够轻松地创建用户友好的应用程序。 DICOM是医学图像和通信标准的缩写,它是医学领域的一种通用文件格式和协议,用于存储、传输和共享医学图像和相关信息。DICOM文件通常包含来自医学成像设备(如CT扫描、MRI、X射线等)的图像数据及其相关的患者信息、检查参数等。 VTKQt和DICOM常常一起使用,用于开发医学图像处理和分析的应用程序。通过使用VTKQt,开发人员可以轻松地创建具有丰富可视化效果的医学图像应用程序,并提供直观、智能化的界面。VTK提供了丰富的图形处理和可视化工具,可以对DICOM图像进行处理、分析和可视化。而Qt的GUI组件和界面设计工具使开发人员能够创建用户友好的应用程序界面,方便用户查看、编辑和分析DICOM图像。 总的来说,VTKQt和DICOM的结合为医学图像处理和分析应用程序的开发提供了强大的工具和功能。它们的使用可以加快开发过程,提高应用程序的效率和用户友好性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值