固定形状可视化(VTK)

使用PCL中第三方库VTK显示多个立方体

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkExtractEdges.h>
typedef vtkActorCollection* vtkActorCollection_Array;
int main()
{
	int i;
	//可以看到图中有27个小正方体组成了一个大的正方体
	//x[8][3],就是每一个小正方体的 8个点的x,y,z值
	float x[8][3] = { { 0, 0, 0 }, { 0.3, 0, 0 }, { 0.3, 0.3, 0 }, { 0, 0.3, 0 },
	{ 0, 0, 0.3 }, { 0.3, 0, 0.3 }, { 0.3, 0.3, 0.3 }, { 0, 0.3, 0.3 } };
	//这个查阅VTK文档发现解释的跟我理解的不一样。。。很有可能是我看不懂。。。
	//我的理解是 这样的, 一个正方体 是由 6个面组成,我们程序也正是打算以面位最小的CELL 来组成我们要的正方体
	//当然,我们也可以用线来画,那样只能画出正方体的边框,就不能用下面用到的PolyData,而要用vtkLine这个对象作为CELL
	//既然选定了 由面来组成,那就产生了六个面,第一个面 是由上面定义的8个点的 0,1,2,3四个点组成,以下以此类推。
	//特别注意的是,这里的0,1,2,3 这几个点,并不是对应的 x[8][3],这里的第0,1,2,3具体为什么下面会说。
	vtkIdType pts[6][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 0, 1, 5, 4 },
	{ 1, 2, 6, 5 }, { 2, 3, 7, 6 }, { 3, 0, 4, 7 } };
	//concrete dataset represents vertices, lines, polygons, and triangle strips,   这是文档里的描述,已经比较清楚了。
	vtkPolyData *cube = vtkPolyData::New();
	//这个用来保存,我们所说的 点之间的拓扑结构,因为根据VTK的流程 ,我们必须这么做,一步步打包。
	vtkCellArray *polys = vtkCellArray::New();
	//这个是关于颜色的属性值,在这里不做重点介绍。
	vtkFloatArray *scalars = vtkFloatArray::New();
	//还是同样的道理,因为我们是用自己定义的点,不是用VTK里面的 vtksphere,vtkcone等 source,所以必须把点放到vtkPoints里
	vtkPoints *points = vtkPoints::New();
	//把我们定义好的点,放到points里,这里的i 才是真正的索引,如果我们的循环从i=8开始
	//真正的点的索引,以及cell中引用的,将会跟这个索引一致
	for (i = 0; i < 8; i++)
	{
		points->InsertPoint(i, x[i]);
	}
	//插入点的拓扑结构,

		//第一个参数 虽然是vtkIdType类型的,但事实上也是一个int型的,文档里的解释第一个参数是 点的个数,第二个是点的内容。
	for (i = 0; i < 6; i++)
	{
		polys->InsertNextCell(4, pts[i]);
	}
	for (i = 0; i < 8; i++)
	{
		scalars->InsertTuple1(i, i);
	}
	//接下来就开始了VTK的pipeline流程。
	cube->SetPoints(points);
	cube->SetPolys(polys);
	cube->GetPointData()->SetScalars(scalars);

		//以前photoshop的时候画一个立方体,会在周围再画上边框,这样会感觉更饱满一些。。。
		vtkExtractEdges *extract = vtkExtractEdges::New();
		extract->SetInputData(cube);
	vtkPolyDataMapper *mapEdges = vtkPolyDataMapper::New();
	mapEdges->SetInputConnection(extract->GetOutputPort());
	mapEdges->SetScalarVisibility(0);
	vtkActor *edgeActor = vtkActor::New();
	edgeActor->SetMapper(mapEdges);
	edgeActor->VisibilityOn();


	vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
	cubeMapper->SetInputData(cube);
	cubeMapper->SetScalarRange(0, 7);
	int No = 0;
	//p,j,k是为了设置立方体的不同位置。
	float p = 0.0, j = 0.0, k = 0.0;
	vtkRenderer *renderer = vtkRenderer::New();
	for (p = 0.0; p < 0.9; p = p + 0.3)
	{
		for (j = 0.0; j < 0.9; j = j + 0.3)
		{
			for (k = 0.0; k < 0.9; k = k + 0.3)
			{
				vtkActor *cubeActor = vtkActor::New();
				//设置ACTOR的不同位置,来显示最终的图形。
				cubeActor->SetPosition(p, j, k);
				vtkActor *tempactor = vtkActor::New();
				cubeActor->SetMapper(cubeMapper);
				renderer->AddActor(cubeActor);
			}
		}
	}

	vtkCamera *camera = vtkCamera::New();
	camera->SetPosition(1, 1, 1);
	camera->SetFocalPoint(0, 0, 0);


	vtkRenderWindow *reWin = vtkRenderWindow::New();
	reWin->AddRenderer(renderer);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(reWin);
	//如果去掉这个style那么,交互的时候,整个立方体会一起转动
	//如果加上,则是每个立方体单独转动   
	//vtkInteractorStyleTrackballActor *style = vtkInteractorStyleTrackballActor::New();
	//iren->SetInteractorStyle(style);

	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();
	renderer->SetBackground(0, 1, 1);

	reWin->SetSize(300, 300);

	reWin->Render();
	iren->Initialize();
	iren->Start();

	points->Delete();
	cube->Delete();
	cubeMapper->Delete();
	renderer->Delete();
	reWin->Delete();
	iren->Delete();
	polys->Delete();
	scalars->Delete();
	return 0;
}

(2)显示单个立方体

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkExtractEdges.h>
typedef vtkActorCollection* vtkActorCollection_Array;
int main()
{
	int i;
	//可以看到图中有27个小正方体组成了一个大的正方体
	//x[8][3],就是每一个小正方体的 8个点的x,y,z值
	int numberpoints = 8;

	float x[8][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 1 }, { 0, 0, 1 }, { 0, 1, 0 }, { 1, 1, 0 }, { 1, 1, 1 }, { 0, 1, 1 } };
	
	//4个面片,每个面片由3个点构成
	vtkIdType pts[6][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 2, 3, 7, 6 }, { 1, 0, 4, 5 }, { 0, 4, 7, 3 }, { 1, 2, 6, 5 } };
	//concrete dataset represents vertices, lines, polygons, and triangle strips,   这是文档里的描述,已经比较清楚了。
	vtkPolyData *cube = vtkPolyData::New();
	//这个用来保存,我们所说的 点之间的拓扑结构,因为根据VTK的流程 ,我们必须这么做,一步步打包。
	vtkCellArray *polys = vtkCellArray::New();
	//这个是关于颜色的属性值,在这里不做重点介绍。
	vtkFloatArray *scalars = vtkFloatArray::New();
	//还是同样的道理,因为我们是用自己定义的点,不是用VTK里面的 vtksphere,vtkcone等 source,所以必须把点放到vtkPoints里
	vtkPoints *points = vtkPoints::New();
	//把我们定义好的点,放到points里,这里的i 才是真正的索引,如果我们的循环从i=8开始
	//真正的点的索引,以及cell中引用的,将会跟这个索引一致

	//对点进行编码,按照0 1 2 3
	for (i = 0; i < numberpoints; i++)//将点出入到点集容器中
	{
		points->InsertPoint(i, x[i]);
	}
	//插入点的拓扑结构,

	//6个面片,每个面片由4个点
	for (i = 0; i < 6; i++)
	{
		polys->InsertNextCell(4, pts[i]);
	}
	for (i = 0; i < 8; i++)
	{
		scalars->InsertTuple1(i, i);
	}
	//接下来就开始了VTK的pipeline流程。
	cube->SetPoints(points);
	cube->SetPolys(polys);
	cube->GetPointData()->SetScalars(scalars);

	//以前photoshop的时候画一个立方体,会在周围再画上边框,这样会感觉更饱满一些。。。
	vtkExtractEdges *extract = vtkExtractEdges::New();
	extract->SetInputData(cube);
	vtkPolyDataMapper *mapEdges = vtkPolyDataMapper::New();
	mapEdges->SetInputConnection(extract->GetOutputPort());
	mapEdges->SetScalarVisibility(0);
	vtkActor *edgeActor = vtkActor::New();
	edgeActor->SetMapper(mapEdges);
	edgeActor->VisibilityOn();


	vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
	cubeMapper->SetInputData(cube);
	cubeMapper->SetScalarRange(0, 1);


	vtkRenderer *renderer = vtkRenderer::New();
	vtkActor *trianActor = vtkActor::New();
	trianActor->SetPosition(0, 0, 0);
	trianActor->SetMapper(cubeMapper);
	renderer->AddActor(trianActor);


	vtkCamera *camera = vtkCamera::New();
	camera->SetPosition(1, 1, 1);
	camera->SetFocalPoint(0, 0, 0);


	vtkRenderWindow *reWin = vtkRenderWindow::New();
	reWin->AddRenderer(renderer);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(reWin);
	//如果去掉这个style那么,交互的时候,整个立方体会一起转动
	//如果加上,立方体不可放缩 
	//vtkInteractorStyleTrackballActor *style = vtkInteractorStyleTrackballActor::New();
	//iren->SetInteractorStyle(style);

	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();
	renderer->SetBackground(0, 1, 1);

	reWin->SetSize(300, 300);

	reWin->Render();
	iren->Initialize();
	iren->Start();

	points->Delete();
	cube->Delete();
	cubeMapper->Delete();
	renderer->Delete();
	reWin->Delete();
	iren->Delete();
	polys->Delete();
	scalars->Delete();
	return 0;
}

(3)显示三角锥

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkExtractEdges.h>
typedef vtkActorCollection* vtkActorCollection_Array;
int main()
{
	int i;
	//可以看到图中有27个小正方体组成了一个大的正方体
	//x[8][3],就是每一个小正方体的 8个点的x,y,z值
	int numberpoints = 4;

	float x[4][3] = { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1.732, 0 }, { 0, 0.57, 1.632 } };

	//4个面片,每个面片由3个点构成
	vtkIdType pts[4][3] = { { 0, 1, 3 }, { 1, 2, 3 }, { 0, 2, 3 }, { 0, 1, 2 } };
	//concrete dataset represents vertices, lines, polygons, and triangle strips,   这是文档里的描述,已经比较清楚了。
	vtkPolyData *cube = vtkPolyData::New();
	//这个用来保存,我们所说的 点之间的拓扑结构,因为根据VTK的流程 ,我们必须这么做,一步步打包。
	vtkCellArray *polys = vtkCellArray::New();
	//这个是关于颜色的属性值,在这里不做重点介绍。
	vtkFloatArray *scalars = vtkFloatArray::New();
	//还是同样的道理,因为我们是用自己定义的点,不是用VTK里面的 vtksphere,vtkcone等 source,所以必须把点放到vtkPoints里
	vtkPoints *points = vtkPoints::New();
	//把我们定义好的点,放到points里,这里的i 才是真正的索引,如果我们的循环从i=8开始
	//真正的点的索引,以及cell中引用的,将会跟这个索引一致

	//对点进行编码,按照0 1 2 3
	for (i = 0; i < numberpoints; i++)//将点出入到点集容器中
	{
		points->InsertPoint(i, x[i]);
	}
	//插入点的拓扑结构,

	//4个面片,每个面片由3个点
	for (i = 0; i < 4; i++)
	{
		polys->InsertNextCell(3, pts[i]);
	}
	for (i = 0; i < 8; i++)
	{
		scalars->InsertTuple1(i, i);
	}
	//接下来就开始了VTK的pipeline流程。
	cube->SetPoints(points);
	cube->SetPolys(polys);
	cube->GetPointData()->SetScalars(scalars);

	//以前photoshop的时候画一个立方体,会在周围再画上边框,这样会感觉更饱满一些。。。
	vtkExtractEdges *extract = vtkExtractEdges::New();
	extract->SetInputData(cube);
	vtkPolyDataMapper *mapEdges = vtkPolyDataMapper::New();
	mapEdges->SetInputConnection(extract->GetOutputPort());
	mapEdges->SetScalarVisibility(0);
	vtkActor *edgeActor = vtkActor::New();
	edgeActor->SetMapper(mapEdges);
	edgeActor->VisibilityOn();


	vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
	cubeMapper->SetInputData(cube);
	cubeMapper->SetScalarRange(0, 1);


	vtkRenderer *renderer = vtkRenderer::New();
	vtkActor *trianActor = vtkActor::New();
	trianActor->SetPosition(0, 0, 0);
	trianActor->SetMapper(cubeMapper);
	renderer->AddActor(trianActor);


	vtkCamera *camera = vtkCamera::New();
	camera->SetPosition(1, 1, 1);
	camera->SetFocalPoint(0, 0, 0);


	vtkRenderWindow *reWin = vtkRenderWindow::New();
	reWin->AddRenderer(renderer);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(reWin);
	//如果去掉这个style那么,交互的时候,整个立方体会一起转动
	//如果加上,立方体不可放缩 
	//vtkInteractorStyleTrackballActor *style = vtkInteractorStyleTrackballActor::New();
	//iren->SetInteractorStyle(style);

	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();
	renderer->SetBackground(0, 1, 1);

	reWin->SetSize(300, 300);

	reWin->Render();
	iren->Initialize();
	iren->Start();

	points->Delete();
	cube->Delete();
	cubeMapper->Delete();
	renderer->Delete();
	reWin->Delete();
	iren->Delete();
	polys->Delete();
	scalars->Delete();
	return 0;
}

(4)任意多边形平面的可视化

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkExtractEdges.h>
typedef vtkActorCollection* vtkActorCollection_Array;
int main()
{
	int i;
	//显示一个正方形与三角形的组合
	int numberpoints = 5;

	float x[5][3] = { { 0, 0, 0 }, { 10, 0, 0 }, { 10, 10, 0 }, { 5, 18.6, 0 }, { 0, 10, 0 } };

	//1个面片,每个面片由5个点构成
	vtkIdType pts[1][5] = { 0, 1, 2, 3, 4 };
	//concrete dataset represents vertices, lines, polygons, and triangle strips,   这是文档里的描述,已经比较清楚了。
	vtkPolyData *cube = vtkPolyData::New();
	//这个用来保存,我们所说的 点之间的拓扑结构,因为根据VTK的流程 ,我们必须这么做,一步步打包。
	vtkCellArray *polys = vtkCellArray::New();
	//这个是关于颜色的属性值,在这里不做重点介绍。
	vtkFloatArray *scalars = vtkFloatArray::New();
	//还是同样的道理,因为我们是用自己定义的点,不是用VTK里面的 vtksphere,vtkcone等 source,所以必须把点放到vtkPoints里
	vtkPoints *points = vtkPoints::New();
	//把我们定义好的点,放到points里,这里的i 才是真正的索引,如果我们的循环从i=8开始
	//真正的点的索引,以及cell中引用的,将会跟这个索引一致

	//对点进行编码,按照0 1 2 3
	for (i = 0; i < numberpoints; i++)//将点出入到点集容器中
	{
		points->InsertPoint(i, x[i]);
	}
	//插入点的拓扑结构,

	//1个面片,每个面片由5个点
	for (i = 0; i < 1; i++)
	{
		polys->InsertNextCell(5, pts[i]);
	}
	for (i = 0; i < 5; i++)
	{
		scalars->InsertTuple1(i, i);
	}
	//接下来就开始了VTK的pipeline流程。
	cube->SetPoints(points);
	cube->SetPolys(polys);
	cube->GetPointData()->SetScalars(scalars);

	//以前photoshop的时候画一个立方体,会在周围再画上边框,这样会感觉更饱满一些。。。
	vtkExtractEdges *extract = vtkExtractEdges::New();
	extract->SetInputData(cube);
	vtkPolyDataMapper *mapEdges = vtkPolyDataMapper::New();
	mapEdges->SetInputConnection(extract->GetOutputPort());
	mapEdges->SetScalarVisibility(0);
	vtkActor *edgeActor = vtkActor::New();
	edgeActor->SetMapper(mapEdges);
	edgeActor->VisibilityOn();


	vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
	cubeMapper->SetInputData(cube);
	cubeMapper->SetScalarRange(0, 1);


	vtkRenderer *renderer = vtkRenderer::New();
	vtkActor *trianActor = vtkActor::New();
	trianActor->SetPosition(0, 0, 0);
	trianActor->SetMapper(cubeMapper);
	renderer->AddActor(trianActor);


	vtkCamera *camera = vtkCamera::New();
	camera->SetPosition(1, 1, 1);
	camera->SetFocalPoint(0, 0, 0);


	vtkRenderWindow *reWin = vtkRenderWindow::New();
	reWin->AddRenderer(renderer);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(reWin);
	//如果去掉这个style那么,交互的时候,整个立方体会一起转动
	//如果加上,立方体不可放缩 
	//vtkInteractorStyleTrackballActor *style = vtkInteractorStyleTrackballActor::New();
	//iren->SetInteractorStyle(style);

	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();
	renderer->SetBackground(0, 1, 1);

	reWin->SetSize(300, 300);

	reWin->Render();
	iren->Initialize();
	iren->Start();

	points->Delete();
	cube->Delete();
	cubeMapper->Delete();
	renderer->Delete();
	reWin->Delete();
	iren->Delete();
	polys->Delete();
	scalars->Delete();
	return 0;
}

(4)将立方体与圆锥体同时可视化显示

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkExtractEdges.h>
typedef vtkActorCollection* vtkActorCollection_Array;
int main()
{
	int i;
	
	//(1)构建立方体对象
	int cube_numberpoints = 8;
	float cube_x[8][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 1 }, { 0, 0, 1 }, { 0, 1, 0 }, { 1, 1, 0 }, { 1, 1, 1 }, { 0, 1, 1 } };
	vtkIdType cube_pts[6][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 2, 3, 7, 6 }, { 1, 0, 4, 5 }, { 0, 4, 7, 3 }, { 1, 2, 6, 5 } };
	vtkPolyData *cube = vtkPolyData::New();
	vtkCellArray *cube_polys = vtkCellArray::New();
	vtkFloatArray *cube_scalars = vtkFloatArray::New();
	vtkPoints *cube_points = vtkPoints::New();

	for (i = 0; i < cube_numberpoints; i++)//将点出入到点集容器中
	{
		cube_points->InsertPoint(i, cube_x[i]);
	}

	//6个面片,每个面片由4个点构成
	for (i = 0; i < 6; i++)
	{
		cube_polys->InsertNextCell(4, cube_pts[i]);
	}
	for (i = 0; i < 8; i++)
	{
		cube_scalars->InsertTuple1(i, i);
	}


	//接下来就开始了VTK的pipeline流程。
	cube->SetPoints(cube_points);
	cube->SetPolys(cube_polys);
	cube->GetPointData()->SetScalars(cube_scalars);


	vtkExtractEdges *cube_extract = vtkExtractEdges::New();
	cube_extract->SetInputData(cube);
	vtkPolyDataMapper *cube_mapEdges = vtkPolyDataMapper::New();
	cube_mapEdges->SetInputConnection(cube_extract->GetOutputPort());
	cube_mapEdges->SetScalarVisibility(0);
	vtkActor *edgeActor = vtkActor::New();
	edgeActor->SetMapper(cube_mapEdges);
	edgeActor->VisibilityOn();


	vtkPolyDataMapper *cube_Mapper = vtkPolyDataMapper::New();
	cube_Mapper->SetInputData(cube);
	cube_Mapper->SetScalarRange(0, 1);
	//立方体构建结束

	//(2)构建正三角锥
	int cone_numberpoints = 4;

	float cone_x[4][3] = { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1.732, 0 }, { 0, 0.57, 1.632 } };
	//4个面片,每个面片由3个点构成
	vtkIdType cone_pts[4][3] = { { 0, 1, 3 }, { 1, 2, 3 }, { 0, 2, 3 }, { 0, 1, 2 } };
	//concrete dataset represents vertices, lines, polygons, and triangle strips,   这是文档里的描述,已经比较清楚了。
	vtkPolyData *cone = vtkPolyData::New();
	//这个用来保存,我们所说的 点之间的拓扑结构,因为根据VTK的流程 ,我们必须这么做,一步步打包。
	vtkCellArray *cone_polys = vtkCellArray::New();
	//这个是关于颜色的属性值,在这里不做重点介绍。
	vtkFloatArray *cone_scalars = vtkFloatArray::New();
	//还是同样的道理,因为我们是用自己定义的点,不是用VTK里面的 vtksphere,vtkcone等 source,所以必须把点放到vtkPoints里
	vtkPoints *cone_points = vtkPoints::New();

	//对点进行编码,按照0 1 2 3
	for (i = 0; i < cone_numberpoints; i++)//将点出入到点集容器中
	{
		cone_points->InsertPoint(i, cone_x[i]);
	}
	//插入点的拓扑结构,

	//4个面片,每个面片由3个点
	for (i = 0; i < 4; i++)
	{
		cone_polys->InsertNextCell(3, cone_pts[i]);
	}
	for (i = 0; i < 8; i++)
	{
		cone_scalars->InsertTuple1(i, i);
	}


	//接下来就开始了VTK的pipeline流程。
	cone->SetPoints(cone_points);
	cone->SetPolys(cone_polys);
	cone->GetPointData()->SetScalars(cone_scalars);

	//以前photoshop的时候画一个立方体,会在周围再画上边框,这样会感觉更饱满一些。。。
	vtkExtractEdges *cone_extract = vtkExtractEdges::New();
	cone_extract->SetInputData(cube);
	vtkPolyDataMapper *cone_mapEdges = vtkPolyDataMapper::New();
	cone_mapEdges->SetInputConnection(cone_extract->GetOutputPort());
	cone_mapEdges->SetScalarVisibility(0);
	vtkActor *cone_edgeActor = vtkActor::New();
	edgeActor->SetMapper(cone_mapEdges);
	edgeActor->VisibilityOn();


	vtkPolyDataMapper *cone_Mapper = vtkPolyDataMapper::New();
	cone_Mapper->SetInputData(cone);
	cone_Mapper->SetScalarRange(0, 1);


	//(3)开始可视化创建的对象(cone_Mapper与cube_Mapper)
	vtkRenderer *renderer = vtkRenderer::New();

	//添加立方体
	vtkActor *cube_Actor = vtkActor::New();
	cube_Actor->SetPosition(0, 0, 0);
	cube_Actor->SetMapper(cube_Mapper);
	renderer->AddActor(cube_Actor);

	//添加圆锥
	vtkActor *cone_Actor = vtkActor::New();
	cone_Actor->SetPosition(2, 2, 2);
	cone_Actor->SetMapper(cone_Mapper);
	renderer->AddActor(cone_Actor);


	vtkCamera *camera = vtkCamera::New();
	camera->SetPosition(1, 1, 1);
	camera->SetFocalPoint(0, 0, 0);

	vtkRenderWindow *reWin = vtkRenderWindow::New();
	reWin->AddRenderer(renderer);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(reWin);

	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();
	renderer->SetBackground(0, 1, 1);

	reWin->SetSize(300, 300);

	reWin->Render();
	iren->Initialize();
	iren->Start();

	cube_points->Delete();
	cube->Delete();
	cube_Mapper->Delete();

	cone_points->Delete();
	cone->Delete();
	cone_Mapper->Delete();


	renderer->Delete();
	reWin->Delete();
	iren->Delete();
	cube_polys->Delete();
	cube_scalars->Delete();
	return 0;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云实验室lab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值