其实前面还应该介绍渲染窗口、渲染场景、演员、交互、属性、相机、灯光、颜色、纹理、坐标。

出图的效果图


无奈上次写完注释的代码没保存,而且也不难,注意语法错误

#include <vtkSmartPointer.h>
#include <vtkStructuredPointsReader.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkMarchingCubes.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>

//测试文件:data/head.vtk
//这段代码是作为vtk可视化管线的入门。可视化管线的三要素是数据对象source、处理对象filter、数据流方向mapper区别:基于数据流的初始化、维持、终止。
//根据数据的生成方式,source可分为程序源对象(procedural如vtkCylinder依据程序代码生成,第一个柱体用过)和读取源对象(reader如vtkDICOMImageReader心脏用过)
//还有就是source 无输入>=1输出 filter>=1输入 >=1输出 mapper>=1输入 无输出
int main(int argc, char* argv[])
{
	if (argc < 2)
	{
		//std::cout<<argv[0]<<" "<<"VTK-File(*.vtk)"<<std::endl;
		//return EXIT_FAILURE;
	}
	//读入Structured_Points类型的vtk文件。我这个程序直接把文件名带进去了 不用额外的读入
	
	vtkSmartPointer<vtkStructuredPointsReader> reader =
		vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName("../head.vtk");//一个弱智的问题是:程序编译时遇到相对路径去哪里找文件?答曰:项目文件同一个路径下

	//用移动立方体法提取等值面。这货是作为filter的,but filter是啥,翻译过来是过滤器
	vtkSmartPointer<vtkMarchingCubes> marchingCubes =
		vtkSmartPointer<vtkMarchingCubes>::New();
	marchingCubes->SetInputConnection(reader->GetOutputPort());//这货只接受一个输入;GetOutputPort和SetInputConnection两边必须类型匹配!
	marchingCubes->SetValue(0, 500);

	//将生成的等值面数据进行Mapper mapper是啥意思来着?用来渲染几何数据
	vtkSmartPointer<vtkPolyDataMapper> mapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(marchingCubes->GetOutputPort());//vtk可视化管线的输入数据接口

	//把Mapper的输出送入渲染引擎进行显示
	//////////////////////////////////////渲染引擎部分////////////////////////////////////
	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	vtkSmartPointer<vtkRenderWindow> renWin =
		vtkSmartPointer<vtkRenderWindow>::New();
	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();

	//鼠标 键盘 时钟的交互机制
	vtkSmartPointer<vtkRenderWindowInteractor> interactor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();	
	
	renWin->AddRenderer(renderer);
	interactor->SetRenderWindow(renWin);
	renderer->AddActor(actor);
	renderer->SetBackground(1.0, 1.0, 1.0);

	
	
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("vtkPipelineDemo");
	

	interactor->Initialize();
	interactor->Start();
	//////////////////////////////////////////////////////////////////////////////////////////////////

	return 0;
}