• (九)QVTKOpenGLNativeWidget同时显示点云和模型


    一、加载点云

    1. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); //创建点云指针
    2. QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    3. if(fileName == "") return;
    4. pcl::io::loadPCDFile(fileName.toStdString(),*cloud);
    5. vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    6. vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
    7. for (int i = 0; i<cloud->size(); i++)
    8. {
    9. vtkIdType pid[1];
    10. pid[0] = points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y, cloud->at(i).z);
    11. vertices->InsertNextCell(1, pid);
    12. }
    13. vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    14. polyData->SetPoints(points);
    15. polyData->SetVerts(vertices);
    16. //映射
    17. vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    18. mapper->SetInputData(polyData);
    19. //演员
    20. vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    21. actor->SetMapper(mapper);
    22. actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
    23. actor->GetProperty()->SetPointSize(2);
    24. renderer->AddActor(actor);
    25. renderer->ResetCamera();

     加载点云文件中的rgba信息并显示

    1. pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
    2. QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    3. if(fileName == "") return;
    4. pcl::io::loadPCDFile(fileName.toStdString(),*cloud);
    5. vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    6. vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
    7. vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
    8. colors->SetNumberOfComponents(4);
    9. for (int i = 0; i<cloud->size(); i++)
    10. {
    11. vtkIdType pid[1];
    12. pid[0] = points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y, cloud->at(i).z);
    13. vertices->InsertNextCell(1, pid);
    14. unsigned char col[4] = {cloud->at(i).r,cloud->at(i).g,cloud->at(i).b,cloud->at(i).a};
    15. colors->InsertNextTypedTuple(col);
    16. }
    17. vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    18. polyData->SetPoints(points);
    19. polyData->SetVerts(vertices);
    20. polyData->GetPointData()->SetScalars(colors);
    21. //映射
    22. vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    23. mapper->SetInputData(polyData);
    24. //演员
    25. vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    26. actor->SetMapper(mapper);
    27. actor->GetProperty()->SetPointSize(2);
    28. renderer->AddActor(actor);
    29. renderer->ResetCamera();

    二、加载obj文件模型

    1. //读取 OBJ 文件
    2. vtkSmartPointer<vtkOBJReader> OBJReader = vtkSmartPointer<vtkOBJReader>::New();
    3. QString fileName = QFileDialog::getOpenFileName(this, "Open OBJ", ".", "Open PCD files(*.obj)");
    4. if(fileName == "") return;
    5. OBJReader->SetFileName(fileName.toStdString().c_str());
    6. OBJReader->Update();
    7. // 创建映射器和演员
    8. vtkSmartPointer<vtkPolyDataMapper> mapperOBJ = vtkSmartPointer<vtkPolyDataMapper>::New();
    9. mapperOBJ->SetInputConnection(OBJReader->GetOutputPort());
    10. vtkSmartPointer<vtkActor> actorOBJ = vtkSmartPointer<vtkActor>::New();
    11. actorOBJ->SetMapper(mapperOBJ);
    12. // 添加演员到渲染器
    13. renderer->AddActor(actorOBJ);
    14. renderer->ResetCamera();

    三、加载stl文件模型

    1. //读取 STL 文件
    2. vtkSmartPointer<vtkSTLReader> STLReader = vtkSmartPointer<vtkSTLReader>::New();
    3. QString fileName = QFileDialog::getOpenFileName(this, "Open STL", ".", "Open PCD files(*.stl)");
    4. if(fileName == "") return;
    5. STLReader->SetFileName(fileName.toStdString().c_str());
    6. STLReader->Update();
    7. // 创建映射器和演员
    8. vtkSmartPointer<vtkPolyDataMapper> mapperSTL = vtkSmartPointer<vtkPolyDataMapper>::New();
    9. mapperSTL->SetInputConnection(STLReader->GetOutputPort());
    10. vtkSmartPointer<vtkActor> actorSTL = vtkSmartPointer<vtkActor>::New();
    11. actorSTL->SetMapper(mapperSTL);
    12. // 添加演员到渲染器
    13. renderer->AddActor(actorSTL);
    14. renderer->ResetCamera();

    四、全部代码

    .pro

    1. #-------------------------------------------------
    2. #
    3. # Project created by QtCreator 2023-10-23T11:32:27
    4. #
    5. #-------------------------------------------------
    6. QT += core gui
    7. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    8. TARGET = vtk_pointCloud_obj
    9. TEMPLATE = app
    10. # The following define makes your compiler emit warnings if you use
    11. # any feature of Qt which has been marked as deprecated (the exact warnings
    12. # depend on your compiler). Please consult the documentation of the
    13. # deprecated API in order to know how to port your code away from it.
    14. DEFINES += QT_DEPRECATED_WARNINGS
    15. # You can also make your code fail to compile if you use deprecated APIs.
    16. # In order to do so, uncomment the following line.
    17. # You can also select to disable deprecated APIs only up to a certain version of Qt.
    18. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
    19. SOURCES += \
    20. main.cpp \
    21. widget.cpp
    22. HEADERS += \
    23. widget.h
    24. FORMS += \
    25. widget.ui
    26. INCLUDEPATH += /usr/include/eigen3
    27. INCLUDEPATH += /usr/local/include/vtk-8.2
    28. LIBS += /usr/local/lib/libvtk*.so
    29. INCLUDEPATH += /usr/local/include/pcl-1.13
    30. LIBS += /usr/local/lib/libpcl_*.so

    main..cpp

    1. #include "widget.h"
    2. #include
    3. #include
    4. #include "QVTKOpenGLNativeWidget.h"
    5. int main(int argc, char *argv[])
    6. {
    7. QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
    8. QApplication a(argc, argv);
    9. Widget w;
    10. w.show();
    11. return a.exec();
    12. }

    .ui

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include "vtkAutoInit.h" // vtk初始化的方式
    5. VTK_MODULE_INIT(vtkRenderingOpenGL2); // 渲染
    6. VTK_MODULE_INIT(vtkInteractionStyle); // 相互做用方式
    7. VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); //
    8. VTK_MODULE_INIT(vtkRenderingFreeType);
    9. #include
    10. #include
    11. #include
    12. #include "vtkPolyDataMapper.h"
    13. #include "vtkRenderWindow.h"
    14. #include "vtkRenderer.h"
    15. #include "vtkActor.h"
    16. #include "vtkProperty.h"
    17. #include "vtkConeSource.h"
    18. #include
    19. #include
    20. namespace Ui {
    21. class Widget;
    22. }
    23. class Widget : public QWidget
    24. {
    25. Q_OBJECT
    26. public:
    27. explicit Widget(QWidget *parent = 0);
    28. ~Widget();
    29. private slots:
    30. void on_load_pointCould_clicked();
    31. void on_load_obj_clicked();
    32. void on_load_stl_clicked();
    33. private:
    34. Ui::Widget *ui;
    35. vtkSmartPointer renderer;//渲染器
    36. };
    37. #endif // WIDGET_H

     widget.cpp

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include <QFileDialog>
    4. Widget::Widget(QWidget *parent) :
    5. QWidget(parent),
    6. ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. renderer = vtkSmartPointer<vtkRenderer>::New();
    10. vtkNew<vtkGenericOpenGLRenderWindow> renwindow;
    11. renwindow->AddRenderer(renderer);
    12. ui->vtk_widget->SetRenderWindow(renwindow.Get());
    13. }
    14. Widget::~Widget()
    15. {
    16. delete ui;
    17. }
    18. void Widget::on_load_pointCould_clicked()
    19. {
    20. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); //创建点云指针
    21. QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    22. if(fileName == "") return;
    23. pcl::io::loadPCDFile(fileName.toStdString(),*cloud);//"/home/li/pcd/bun_zipper.pcd"
    24. vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    25. vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
    26. for (int i = 0; i<cloud->size(); i++)
    27. {
    28. vtkIdType pid[1];
    29. pid[0] = points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y, cloud->at(i).z);
    30. vertices->InsertNextCell(1, pid);
    31. }
    32. vtkSmartPointer<vtkPolyData> polyData = vtkPolyData::New();
    33. polyData->SetPoints(points);
    34. polyData->SetVerts(vertices);
    35. //映射
    36. vtkSmartPointer<vtkPolyDataMapper> mapper = vtkPolyDataMapper::New();
    37. mapper->SetInputData(polyData);
    38. //演员
    39. vtkSmartPointer<vtkActor> actor = vtkActor::New();
    40. actor->SetMapper(mapper);
    41. actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
    42. actor->GetProperty()->SetPointSize(2);
    43. renderer->AddActor(actor);
    44. renderer->ResetCamera();
    45. }
    46. void Widget::on_load_obj_clicked()
    47. {
    48. //读取 OBJ 文件
    49. vtkSmartPointer<vtkOBJReader> OBJReader = vtkSmartPointer<vtkOBJReader>::New();
    50. QString fileName = QFileDialog::getOpenFileName(this, "Open OBJ", ".", "Open PCD files(*.obj)");
    51. if(fileName == "") return;
    52. OBJReader->SetFileName(fileName.toStdString().c_str()); //"/home/li/pcd/RedLeaf.obj"
    53. OBJReader->Update();
    54. // 创建映射器和演员
    55. vtkSmartPointer<vtkPolyDataMapper> mapperOBJ = vtkSmartPointer<vtkPolyDataMapper>::New();
    56. mapperOBJ->SetInputConnection(OBJReader->GetOutputPort());
    57. vtkSmartPointer<vtkActor> actorOBJ = vtkSmartPointer<vtkActor>::New();
    58. actorOBJ->SetMapper(mapperOBJ);
    59. // 添加演员到渲染器
    60. renderer->AddActor(actorOBJ);
    61. renderer->ResetCamera();
    62. }
    63. void Widget::on_load_stl_clicked()
    64. {
    65. //读取 STL 文件
    66. vtkSmartPointer<vtkSTLReader> STLReader = vtkSmartPointer<vtkSTLReader>::New();
    67. QString fileName = QFileDialog::getOpenFileName(this, "Open STL", ".", "Open PCD files(*.stl)");
    68. if(fileName == "") return;
    69. STLReader->SetFileName(fileName.toStdString().c_str()); //"/home/li/pcd/skull_50.stl"
    70. STLReader->Update();
    71. // 创建映射器和演员
    72. vtkSmartPointer<vtkPolyDataMapper> mapperSTL = vtkSmartPointer<vtkPolyDataMapper>::New();
    73. mapperSTL->SetInputConnection(STLReader->GetOutputPort());
    74. vtkSmartPointer<vtkActor> actorSTL = vtkSmartPointer<vtkActor>::New();
    75. actorSTL->SetMapper(mapperSTL);
    76. // 添加演员到渲染器
    77. renderer->AddActor(actorSTL);
    78. renderer->ResetCamera();
    79. }

     效果展示

    五、3d模型下载网址

     专业版 3D 模型 :: TurboSquid

    六、问题

    有个问题:在槽函数中显示点云和模型,加载出来之后,需要点击一下界面才能显示出来,如果全部写在构造函数中就可以直接全部显示出来。我把能加的update函数都试了一遍,都不管用。想的是如果知道点击界面时的源码,执行了什么函数,就可以解决差问题了。如果有知道的朋友一定要留言告知呀,万分感谢!!!

    解决啦!!!!!!

    只需要在最后加上下面这句就可以啦!!!!

        ui->vtk_widget->GetRenderWindow()->Render();

    例如:

    1. //读取 OBJ 文件
    2. vtkSmartPointer<vtkOBJReader> OBJReader = vtkSmartPointer<vtkOBJReader>::New();
    3. QString fileName = QFileDialog::getOpenFileName(this, "Open OBJ", ".", "Open PCD files(*.obj)");
    4. if(fileName == "") return;
    5. OBJReader->SetFileName(fileName.toStdString().c_str()); //"/home/li/pcd/RedLeaf.obj"
    6. OBJReader->Update();
    7. // 创建映射器和演员
    8. vtkSmartPointer<vtkPolyDataMapper> mapperOBJ = vtkSmartPointer<vtkPolyDataMapper>::New();
    9. mapperOBJ->SetInputConnection(OBJReader->GetOutputPort());
    10. vtkSmartPointer<vtkActor> actorOBJ = vtkSmartPointer<vtkActor>::New();
    11. actorOBJ->SetMapper(mapperOBJ);
    12. // 添加演员到渲染器
    13. renderer->AddActor(actorOBJ);
    14. renderer->ResetCamera();
    15. ui->vtk_widget->GetRenderWindow()->Render();

    资源见https://download.csdn.net/download/m0_67254672/88955839?spm=1001.2014.3001.5501

  • 相关阅读:
    Ubuntu源码编译gdal3.6.2
    0.o?让我看看怎么个事儿之SpringBoot自动配置
    利用角色roles上线wordpress项目
    linux 下用posix semaphore 解决资源竞争问题实例
    【手撕数据结构】二分查找(好多细节)
    自学Python07-学会用Python读取Json 文件
    HBase 开发:使用Java操作HBase 第2关:添加数据
    C语言《认识结构体》---重点解析内存对齐
    请回答数据结构-【并查集&LRUCache】
    Kubernets Pod 存在 Finalizers 一直处于 Terminating 状态
  • 原文地址:https://blog.csdn.net/m0_67254672/article/details/134008609