1. A brief introduction to octree
Octree is a space division structure and an extension of a binary tree. Each node can have up to 8 child nodes.
2. The use of octree in VTK
1. Directly load the ply file to display the octree
vtkSmartPointer<vtkPLYReader> PLYReader = vtkSmartPointer<vtkPLYReader>::New();
QString fileName = QFileDialog::getOpenFileName(this, "Open PLY", ".", "Open PCD files(*.ply)");
if(fileName == "") return;
PLYReader->SetFileName(fileName.toStdString().c_str());
PLYReader->Update();
//八叉树
vtkSmartPointer<vtkOctreePointLocator> octree = vtkSmartPointer<vtkOctreePointLocator>::New();
octree->SetMaximumPointsPerRegion(5);
octree->SetDataSet(PLYReader->GetOutput());
octree->BuildLocator();
//数据
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
octree->GenerateRepresentation(0, polydata);
//映射
vtkSmartPointer<vtkPolyDataMapper> octreeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
octreeMapper->SetInputData(polydata);
//演员
vtkSmartPointer<vtkActor> octreeActor = vtkSmartPointer<vtkActor>::New();
octreeActor->SetMapper(octreeMapper);
octreeActor->GetProperty()->SetInterpolationToFlat();// 设置对象的着色插值方法。
octreeActor->GetProperty()->SetRepresentationToWireframe();// 控制对象的曲面几何图形表达。
octreeActor->GetProperty()->SetColor((float)233/255,(float)233/255,(float)233/255);
octree->GenerateRepresentation(7, polydata);//创建八叉树区域边界的多数据表示。
renderer->AddActor(octreeActor);
renderer->ResetCamera();
ui->vtk_widget->GetRenderWindow()->Render();
2. Display octree based on point cloud data
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
if(fileName == "") return;
pcl::io::loadPCDFile<pcl::PointXYZ>(fileName.toStdString(), *cloud);
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
for (int i = 0; i<cloud->size(); i++)
{
points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y, cloud->at(i).z);
}
//数据
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();;
polyData->SetPoints(points);
//八叉树
vtkSmartPointer<vtkOctreePointLocator> octree = vtkSmartPointer<vtkOctreePointLocator>::New();
octree->SetMaximumPointsPerRegion(5);
octree->SetDataSet(polyData);
octree->BuildLocator();
//映射
vtkSmartPointer<vtkPolyDataMapper> mapperpointCloud_points = vtkSmartPointer<vtkPolyDataMapper>::New();
mapperpointCloud_points->SetInputData(polyData);
//演员
vtkSmartPointer<vtkActor> octreeActor = vtkSmartPointer<vtkActor>::New();
octreeActor->GetProperty()->SetInterpolationToFlat();// 设置对象的着色插值方法。
octreeActor->GetProperty()->SetRepresentationToWireframe();// 控制对象的曲面几何图形表达。
octreeActor->GetProperty()->SetColor((float)200/255,(float)200/255,(float)200/255);
octreeActor->SetMapper(mapperpointCloud_points);
octree->GenerateRepresentation(8, polyData);//创建八叉树区域边界的多数据表示。
renderer->AddActor(octreeActor);
renderer->ResetCamera();
ui->vtk_widget->GetRenderWindow()->Render();
3. Operation results
You can modify the value in octree->GenerateRepresentation(8, polyData); to change the octree grid size.