QT通过VTK读取stl模型并着色 Mac

本文详细介绍了如何在Mac环境下配置VTK与Qt进行三维图形渲染,包括CMake、Qt和VTK的安装配置过程。通过实例代码展示了如何读取STL文件,创建顶点、单元和数组对象,以及使用颜色映射表进行数据映射,最终实现在Qt中显示三维模型。

1.对于在Mac下如何配置VTK,或者是qt下的.pro文件里面的引入包名,请参考我的上一篇博客Mac+CMake3.13.2+Qt5.12.0+VTK8.1.2 配置安装
2.读取stl文件
3.创建相应的顶点对象、立方体对象、单元数组对象
4.通过读取stl模型里面的单元,将单元的坐标索引赋值给一个二维数组
5.将stl模型里面的顶点坐标,存储到第3步定义的顶点对象里
6.将读取到的单元,赋值到第3步定义的单元数组对象里
7.设定每个顶点的标量值,用于颜色的查找
8.定义颜色表
9.数据的映射
。。。后面的就差不多是初始化并显示了
这里附上main.cpp的完整代码

#include "mainwindow.h"
#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
//#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL2,vtkRenderingOpenGL2)
//#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL2)

#include <QDebug>//调试用的

#include <vtkVersion.h>
#include <vtkPlaneSource.h>
#include <vtkPolyData.h>
#include <vtkSTLReader.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkConeSource.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLookupTable.h>

using namespace std;

int main(int, char *[])
{

    std::string inputFilename="/Users/chentingxuan/Desktop/1.stl";//stl文件路径

    //读取stl文件
    vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
        reader->SetFileName(inputFilename.c_str());
        reader->Update();

        //创建mapper
        vtkSmartPointer<vtkPolyDataMapper> mapper =
               vtkSmartPointer<vtkPolyDataMapper>::New();
           mapper->SetInputConnection(reader->GetOutputPort());


  //创建对象
  vtkPolyData *cube = vtkPolyData::New();//立方体
  vtkPoints *points = vtkPoints::New();//顶点坐标
  vtkCellArray *polys=vtkCellArray::New();//单元数组

  //存储标量值
  vtkFloatArray *scalars = vtkFloatArray::New();

  vtkPolyData *polydata=reader->GetOutput();

  //用于动态创建二维数组,用于存储顶点的索引
  vtkIdType (*y)[3] = new vtkIdType[polydata->GetNumberOfCells()][3];

  //读取细胞单元,并将坐标的索引赋值给二维数组y
  for(int i =0;i<polydata->GetNumberOfCells();i++)
  {
      //l1=polydata->GetCell(i)->GetPointIds();
      y[i][0]=polydata->GetCell(i)->GetPointIds()->GetId(0);

      y[i][1]=polydata->GetCell(i)->GetPointIds()->GetId(1);

      y[i][2]=polydata->GetCell(i)->GetPointIds()->GetId(2);

  }

  //存储顶点
  for(int i=0;i<polydata->GetNumberOfPoints();i++)
  {
      double x[]={0,0,0};
      polydata->GetPoint(i,x);//获取顶点坐标
      points->InsertPoint(i,x);//将顶点坐标插入到vtkPoints定义的points
  }

  //设定单元
  for(int i=0;i<polydata->GetNumberOfCells();i++)
  {
     polys->InsertNextCell(3,y[i]);
  }
  //存储每个顶点的标量值,也就是颜色的索引值,这里暂时是以顶点的先后顺序来设定的
  for(int i=0;i<polydata->GetNumberOfPoints();i++)
  {
      scalars->InsertTuple1(i,i);
  }

  //创建多边形数据
  cube->SetPoints(points);
  //设定单元类型为多边形
  cube->SetPolys(polys);
  //设定每个顶点的标量值
  cube->GetPointData()->SetScalars(scalars);

  points->Delete();
  polys->Delete();
  scalars->Delete();

  //定义颜色映射表
  vtkLookupTable *pColorTable = vtkLookupTable::New();

  //设置颜色表中的颜色,下列两种方式都可以
  /*
  pColorTable->SetNumberOfColors(4);
  pColorTable->SetTableValue(0,1.0,0.0,0.0,1.0);
  pColorTable->SetTableValue(0,1.0,0.0,0.0,1.0);
  pColorTable->SetTableValue(1,0.0,1.0,0.0,1.0);
  pColorTable->SetTableValue(2,1.0,1.0,0.0,1.0);
  pColorTable->SetTableValue(3,0.0,0.0,1.0,1.0);
  */
  //设置颜色表中的颜色
  pColorTable->SetNumberOfColors(256);
  pColorTable->SetHueRange(0.67, 0.0);        //色调范围从红色到蓝色

  pColorTable->Build();

  //数据映射
    vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
    cubeMapper->SetInputData(cube);
    cubeMapper->SetScalarRange(0,polydata->GetNumberOfPoints()-1);
    cubeMapper->SetLookupTable(pColorTable);
    vtkActor *cubeActor = vtkActor::New();
    cubeActor->SetMapper(cubeMapper);
qDebug()<<"admin"<<polydata->GetNumberOfPoints();

  // Create a renderer(渲染器), render window and interactor(渲染窗口)
  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  renderWindow->SetSize(1300,1300);//设置窗口大小
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // Add the actors to the scene
  renderer->AddActor(cubeActor);
  renderer->SetBackground(.1,.2,.3); // Background color dark blue

  // Render and interact
  renderWindow->Render();
  renderWindowInteractor->Start();



  return EXIT_SUCCESS;
}

运行结果如下:
在这里插入图片描述

Qt是一个跨平台的应用程序框架,而VTK (Visualization Toolkit) 是一个用于可视化科学数据的强大工具库。在Qt中集成VTK,你可以创建交互式的3D图形应用程序。要使用VTK读取STL文件Qt中显示,你需要按照以下步骤操作: 1. 安装VTK for Qt:首先,确保已经安装了Qt和相应的VTK版本。你可以从官网下载预构建的Qt-VTK模块,如QVTKWidgets或QVTKOpenGL。 2. 设置环境:在项目中引入所需的头文件,链接到VTK库。配置Qt构建系统,如CMake,以包含VTK。 3. 读取STL文件:使用VTK的`vtkSTLReader`类,创建一个实例加载STL文件。例如: ```cpp vtkSmartPointer<vtkSTLReader> stlReader = vtkSmartPointer<vtkSTLReader>::New(); stlReader->SetFileName("path_to_your_stl_file.stl"); ``` 4. 创建渲染管线:将`stlReader`添加到渲染管线中,然后创建一个`vtkActor`来表示模型将其添加到`vtkRenderer`中。 5. 显示3D窗口:在Qt中,你可以使用QVTKWidget来显示VTK渲染窗口。设置好窗口大小、标题等属性后,调用`render()`方法更新视图。 6. 渲染与事件处理:最后,确保你在适当的地方渲染窗口,处理用户的交互,如缩放、平移和旋转。 示例代码片段: ```cpp #include <QApplication> #include <QVTKWidget.h> #include "vtkSmartPointer.h" #include "vtkSTLReader.h" class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 初始化VTK widget QVTKWidget *qvtkWidget = new QVTKWidget(this); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(qvtkWidget); // 创建渲染器和窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); qvtkWidget->GetRenderWindow()->AddRenderer(renderer); // 读取STL文件 vtkSTLReader* reader = vtkSTLReader::New(); reader->SetFileName("path_to_your_stl_file.stl"); // 将模型添加到渲染器 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New(); mapper->SetInputConnection(reader->GetOutputPort()); vtkActor *actor = vtkActor::New(); actor->SetMapper(mapper); renderer->AddActor(actor); // 设置相机和光照 // ... // 开始渲染 renderer->Render(); // 监听窗口关闭信号 connect(qvtkWidget, &QVTKWidget::closeEvent, this, &MainWindow::onClose); } private slots: void onClose(QCloseEvent *) { deleteLater(); } }; int main(int argc, char **argv) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值