Qt 5.15.2, PCL 1.14.1, VTK 9.3, Visual Studio 2022, Windows 10.
Облако точек представляет собой случайное сгенерировано облако точек.
На самом деле я использовал и другие модели облаков точек, и результат был тот же.
Исходный код выглядит следующим образом:
main.cpp
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
class Ui_QtPCLDemoClass
{
public:
QWidget* centralWidget;
QVTKOpenGLNativeWidget* openGLWidget;
QMenuBar* menuBar;
QToolBar* mainToolBar;
QStatusBar* statusBar;
void setupUi(QMainWindow* QtPCLDemoClass)
{
if (QtPCLDemoClass->objectName().isEmpty())
QtPCLDemoClass->setObjectName(QString::fromUtf8("QtPCLDemoClass"));
QtPCLDemoClass->resize(1202, 844);
centralWidget = new QWidget(QtPCLDemoClass);
centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
openGLWidget = new QVTKOpenGLNativeWidget(centralWidget);
openGLWidget->setObjectName(QString::fromUtf8("openGLWidget"));
openGLWidget->setGeometry(QRect(10, 10, 1081, 691));
QtPCLDemoClass->setCentralWidget(centralWidget);
menuBar = new QMenuBar(QtPCLDemoClass);
menuBar->setObjectName(QString::fromUtf8("menuBar"));
menuBar->setGeometry(QRect(0, 0, 1202, 23));
QtPCLDemoClass->setMenuBar(menuBar);
mainToolBar = new QToolBar(QtPCLDemoClass);
mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
QtPCLDemoClass->addToolBar(Qt::TopToolBarArea, mainToolBar);
statusBar = new QStatusBar(QtPCLDemoClass);
statusBar->setObjectName(QString::fromUtf8("statusBar"));
QtPCLDemoClass->setStatusBar(statusBar);
retranslateUi(QtPCLDemoClass);
QMetaObject::connectSlotsByName(QtPCLDemoClass);
} // setupUi
void retranslateUi(QMainWindow* QtPCLDemoClass)
{
QtPCLDemoClass->setWindowTitle(QCoreApplication::translate("QtPCLDemoClass", "QtPCLDemo", nullptr));
} // retranslateUi
};
namespace Ui {
class QtPCLDemoClass : public Ui_QtPCLDemoClass {};
} // namespace Ui
QT_END_NAMESPACE
class QtPCLDemo : public QMainWindow
{
Q_OBJECT
public:
QtPCLDemo(QWidget* parent = nullptr);
private:
Ui::QtPCLDemoClass ui;
pcl::PointCloud::Ptr cloud;
boost::shared_ptr view;
};
QtPCLDemo::QtPCLDemo(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
vtkSmartPointer renderer = vtkSmartPointer::New();
vtkSmartPointer renderWindow =
vtkSmartPointer::New();
renderWindow->AddRenderer(renderer);
view.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow,
"viewer", false));
view->setupInteractor(ui.openGLWidget->interactor(),
ui.openGLWidget->renderWindow());
ui.openGLWidget->setRenderWindow(view->getRenderWindow());
pcl::PointCloud::Ptr cloud(
new pcl::PointCloud);
srand(static_cast(time(0)));
cloud->width = 100;
cloud->height = 10;
cloud->points.resize(cloud->width * cloud->height);
for (std::size_t i = 0; i < cloud->points.size(); ++i)
{
cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
}
pcl::visualization::PointCloudColorHandlerGenericField fildColor(cloud, "z");
view->addPointCloud(cloud, fildColor, "cloud");
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "cloud");
view->spin();
ui.openGLWidget->update();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtPCLDemo w;
w.show();
return a.exec();
}
#include "main.moc"
[img]https://i.sstatic. net/7oQmLvnel.jpg[/img]
После поворота перспективы стало вот так:

и вот так:


Я пытался отобразить это облако точек с помощью консоли C++ и библиотеки PCL, и вращение перспективы может полностью отобразить облако точек.
Как использовать VTK для отображения облаков точек в Qt, чтобы они могли полностью отображаться даже при вращении перспективы?
Подробнее здесь: https://stackoverflow.com/questions/790 ... isplay-pcd