【vs+qt】使用VTK库读取STL模型,将STL模型显示在QT界面上

概要

完整的界面使用,点击按钮选择文件,读取stl三维模型,将模型显示在qvtkWidget控件上。

效果展示

1.选择文件地址
![](https://img-blog.csdnimg.cn/54001afa109f48c387ad5e47bf042af8.png

2.界面窗口展示
在这里插入图片描述

实现步骤

1.点击打开文件按钮,选择文件路径,进行判断,读取文件正常的话继续执行VTK可视化操作,如果读取到的文件内容为空,弹出报错窗口。
注:设置按钮、连接槽函数之类的在这里就不多说了,比较常见的功能了。

stl_fileName = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择文件路径..."), "*.stl");
    if (stl_fileName.isEmpty())
    {
        QMessageBox::warning(this, "Warning!", "Failed to open the file!");
    }
    else
    {
     //读取操作.......
    }

2.利用VTK的读取操作,代码解析如下
需要的vtk库函数如下:

#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>

第一步,创建STL读取器

// 创建 STL 读取器
    vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName(stl_fileName.toStdString().c_str());
    reader->Update();

这里需要注意的一点,在导入stl_fileName的时候进行了一步操作:toStdString().c_str(),如果大家不是在qt界面上进行操作那么完全可以直接写stl_fileName,而在qt界面上使用我们定义的是

QString stl_fileName

所以读取的时候要进行转换字符串,否则会在这个报错:未定义该类型的运算符

第二步,创建 VTK 映射和演员

 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
 mapper->SetInputData(reader->GetOutput());

 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
 actor->SetMapper(mapper);

这算是VTK比较主体的思想了,大家可以想像成一个舞台表演人员穿着表演服饰。Mapper(映射器):把不同的数据类型,转成图形数据。Actor(演员):执行渲染mapper的对象。

第三步,创建VTK渲染器

// 创建 VTK 渲染器
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);//这一步是使用qt的不同之处
 // 添加演员到渲染器
    renderer->AddActor(actor);

这里的意思是承接上一步操作,渲染器顾名思义是用来渲染图像的,将演员加入渲染器,相当于舞台表演人员站上了舞台。

需要注意这一步:

ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);

从ui界面获取qvtkwidget控件的渲染窗口,将渲染器加进去。渲染窗口可以理解成一个剧院,里面有舞台、演员。就可以很好的展示图形了。

注:
在ui界面里已经添加了qvtkwidget控件,如果你正确配置完VTK库的话,正常是可以添加成这样的
在这里插入图片描述
注意:左下角的qvtkwidget控件。

最后,初始化一下渲染窗口

 // 设置渲染器背景色等属性
    renderer->SetBackground(0.1, 0.1, 0.1);

    // 渲染窗口初始化
    ui.qvtkWidget->GetRenderWindow()->Render();

代码汇总

#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>

QString stl_fileName;

   stl_fileName = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择文件路径..."), "*.stl");
    if (stl_fileName.isEmpty())
    {
        QMessageBox::warning(this, "Warning!", "Failed to open the file!");
    }
    else
    {
    // 创建 STL 读取器
    vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName(stl_fileName.toStdString().c_str());
    reader->Update();

    // 创建 VTK 映射和演员
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(reader->GetOutput());

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 创建 VTK 渲染器
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);

    // 添加演员到渲染器
    renderer->AddActor(actor);

    // 设置渲染器背景色等属性
    renderer->SetBackground(0.1, 0.1, 0.1);

    // 渲染窗口初始化
    ui.qvtkWidget->GetRenderWindow()->Render();

    }

将这些代码加入正确的位置,即可使用。由于我的项目是主界面子界面分不同的功能类的,而且还有其他功能,就把vtk显示这一部分的代码贴了上来,大家根据需要进行添加,

小结

1.如果出现vtk警告控件过期将被移除:

Generic Warning: In E:\GitHub\VTK\GUISupport\Qt\QVTKWidget.cxx, line 83
QVTKWidget was deprecated for VTK 8.1 and will be removed in a future version.

Generic Warning: In E:\GitHub\VTK\GUISupport\Qt\QVTKPaintEngine.cxx, line 25
QVTKPaintEngine was deprecated for VTK 8.1 and will be removed in a future version
在这里插入图片描述
大家可在主界面添加

#include <vtkOutputWindow.h>
...
...
...
   vtkOutputWindow::SetGlobalWarningDisplay(0);//屏蔽警告
...
...

2.如果出现vtk界面显示卡顿、乱码已经重复等情况,那可能是和控件界面显示没有初始化有关系
可添加

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)

进行vtk初始化。

记录项目经历,帮助自己理解学习,欢迎大家交流讨论,毕竟项目功能不同、写法不同。大家仅作参考!

  • 18
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt使用VTK(Visualization Toolkit)加载obj3d模型,您可以使用VTKQt插件,即VTKQt渲染窗口类QVTKOpenGLNativeWidget。 以下是一个简单的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkOBJReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <QVTKOpenGLNativeWidget.h> #include <QVBoxLayout> #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建Qt窗口和布局 QWidget *widget = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(widget); // 创建QVTKOpenGLNativeWidget并添加到布局 QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(); layout->addWidget(vtkWidget); // 创建VTK渲染器和渲染窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 将QVTKOpenGLNativeWidget与VTK渲染窗口关联 vtkWidget->SetRenderWindow(renderWindow); // 加载obj3d模型 vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New(); reader->SetFileName("path/to/your/model.obj"); reader->Update(); // 创建VTK演员和映射器 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(reader->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 将演员添加到渲染器 renderer->AddActor(actor); // 显示窗口 widget->show(); // 运行Qt事件循环 return app.exec(); } ``` 在上面的代码,我们创建了一个Qt窗口和布局,然后创建了一个QVTKOpenGLNativeWidget并将其添加到布局。然后,我们创建了一个VTK渲染器和渲染窗口,并将QVTKOpenGLNativeWidget与VTK渲染窗口关联。接下来,我们加载obj3d模型并创建VTK演员和映射器。最后,我们将演员添加到渲染器,并显示窗口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值