VTK实现批量将点云中的点生成小球体
原文链接:https://blog.csdn.net/hw140701/article/details/77712900
- 代码作用:将点云中的每个点以小球体的形式展示,球体颜色大小可变。
- 代码缺陷:无法显示点云原有颜色。(代码二实现了该功能)
#include <iostream>
#include <vector>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkInteractorStyleTrackball.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#include <vtkPolyDataMapper.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
using namespace std;
void main(int argc, char* argv[])
{
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer< vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> istyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetInteractorStyle(style);//设置交互器风格
//_读进点云数据信息
FILE*fp = NULL; fp = fopen("C:\\Users\\426-4\\Desktop\\2_gt.txt", "r"); //2DpointDatas.txt
if (!fp)
{
printf("打开文件失败!!\n");
int m;
cin >> m;
exit(0);
}
float x = 0, y = 0, z = 0, c = 0;
int i = 0;
while (!feof(fp))
{
fscanf(fp, "%f %f %f %f", &x, &y, &z, &c);
//以每一个三维作为中心画球
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();//定义局部球对象
sphereSource->SetCenter(x, y, z);//设置球的中心
sphereSource->SetRadius(0.006);//设置球的半径
sphereSource->SetThetaResolution(30);//设置球表面精度,值越大球的光滑程度越高
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();//定义局部PolydataMapper对象
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();//定义局部actor对象
actor->SetMapper(mapper);
if (i == 10){
actor->GetProperty()->SetColor(1, 0, 0);
}
else {
actor->GetProperty()->SetColor(0, 1, 0);//设置球的颜色,这里可以为每个点赋不同的颜色或者是随机颜色
}
actor->GetProperty()->SetRepresentationToWireframe();//以线框的方式显示
// actor->GetProperty()->SetRepresentationToSurface();//以表面的方式显示
renderer->AddActor(actor);//将局部的actor加入到全局的绘制对象renderer中
i++;
}
fclose(fp);
renderer->SetBackground(1, 1, 1);//设置背景颜色
renderWindow->Render();
renderWindow->SetSize(800, 800);//设置窗口大小
renderWindowInteractor->Start();
}
代码二:添加了显示原点云颜色
#include <iostream>
#include <vector>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkInteractorStyleTrackball.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#include <vtkPolyDataMapper.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
using namespace std;
void main(int argc, char* argv[])
{
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer< vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> istyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetInteractorStyle(style);//设置交互器风格
//_读进点云数据信息
FILE*fp = NULL; fp = fopen("C:\\Users\\426-4\\Desktop\\crop.txt", "r"); //2DpointDatas.txt
if (!fp)
{
printf("打开文件失败!!\n");
int m;
cin >> m;
exit(0);
}
float x = 0, y = 0, z = 0;
int c = 0;
int i = 0;
while (!feof(fp))
{
fscanf(fp, "%f %f %f %f", &x, &y, &z, &c);
//以每一个三维作为中心画球
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();//定义局部球对象
sphereSource->SetCenter(x, y, z);//设置球的中心
sphereSource->SetRadius(0.04);//设置球的半径
sphereSource->SetThetaResolution(30);//设置球表面精度,值越大球的光滑程度越高
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();//定义局部PolydataMapper对象
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();//定义局部actor对象
actor->SetMapper(mapper);
double r = (c >> 16) & 0x0000ff;//计算点的RGB值
double g = (c >> 8) & 0x0000ff;
double b = (c) & 0x0000ff;
actor->GetProperty()->SetColor(r/255, g/255,b/255);
actor->GetProperty()->SetRepresentationToWireframe();//以线框的方式显示
// actor->GetProperty()->SetRepresentationToSurface();//以表面的方式显示
renderer->AddActor(actor);//将局部的actor加入到全局的绘制对象renderer中
i++;
}
fclose(fp);
renderer->SetBackground(1, 1, 1);//设置背景颜色
renderWindow->Render();
renderWindow->SetSize(800, 800);//设置窗口大小
renderWindowInteractor->Start();
}