vtk三维点云隐式曲面重建:vtkSurfaceConstructionFilter类

vtk三维点云重建vtkSurfaceConstructionFilter

vtkSurfaceReconstructionFilter获取假设为位于实体3D对象表面上的点列表。 计算与表面距离的带符号度量,并在常规网格上采样。 然后可以将网格轮廓化为零以提取表面,使用了三维点云隐式曲面重构技术。

#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkSmartPointer.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkPoints.h"
#include "vtkCellArray.h"
#include "vtkSurfaceReconstructionFilter.h"
#include "vtkContourFilter.h"
void main()
{
	vtkSmartPointerren=vtkSmartPointer::New();             //设置绘制者(绘制对象指针)
	vtkSmartPointerrenWin=vtkSmartPointer::New();         //设置绘制窗口
	

	vtkSmartPointeriren=vtkSmartPointer::New();//设置绘制交互操作窗口的
	

	vtkSmartPointerm_Points=vtkSmartPointer::New();
	vtkSmartPointervertices=vtkSmartPointer::New();
	//_读进点云数据信息
	FILE*fp = NULL;
	fp=fopen("斯坦福兔子.txt","r");	//读取TXT中的XYZ坐标
	if(!fp)
	{

		printf("打开文件失败!!\n");
		exit(0);
	}
	double x=0,y=0,z=0;
	int i = 0;
	while (!feof(fp))
	{
		fscanf(fp,"%lf	%lf	%lf",&x,&y,&z);	
		m_Points->InsertPoint(i,x,y,z);	//_加入点信息
		
		vertices->InsertNextCell(1);		//_加入细胞顶点信息----用于渲染点集
		vertices->InsertCellPoint(i);
		i ++;
	}	
	fclose(fp);

	vtkSmartPointerpoints=vtkSmartPointer::New();
	points->SetPoints(m_Points);
	vtkSmartPointersurf=vtkSmartPointer::New();
	surf->SetInput(points);
	
	vtkSmartPointercontour=vtkSmartPointer::New();
	contour->SetInputConnection(surf->GetOutputPort());
	contour->SetValue(0,0.0);

	vtkSmartPointerpointMapper=vtkSmartPointer::New();
	pointMapper->SetInput(contour->GetOutput());
	vtkSmartPointeractor=vtkSmartPointer::New();
	actor->SetMapper(pointMapper);
	ren->AddActor(actor);
	renWin->AddRenderer(ren);
	renWin->SetSize(800,800);
	iren->SetRenderWindow(renWin);
	renWin->Render();
	iren->Start();	

}

重建结果

vtk三维点云隐式曲面重建:vtkSurfaceConstructionFilter类_第1张图片

vtk三维点云隐式曲面重建:vtkSurfaceConstructionFilter类_第2张图片

vtk三维点云隐式曲面重建:vtkSurfaceConstructionFilter类_第3张图片

你可能感兴趣的:(VTK,C++)