1、前言
vtkProp;
vtkAbstractMapper;
vtkProperty;
vtkCamera;
vtkLight;
vtkRenderer;
vtkRenderWindow;
vtkRenderWindowInteractor;
vtkTransform;
vtkLookupTable;............
这些类都是与数据显示或渲染相关的。
用计算机图形学的专业词汇来说,就是它们构成了 VTK的渲染引擎(RenderingEngine)。
渲染引擎主要负责数据的可视化表达,是VTK里的两个重要概念之一,而另一个重要概念就是可视化管线(Visualization Pipeline)。
2、可视化管线
可视化管线是指用于获取或创建数据、处理数据以及把数据写入文件或者把数据传递给渲染引擎进行显示,这样的一种结构在 VTK里就称为可视化管线。
数据对象(Data Obiect)处理对象(Process Object)和数据流方向(Direction ofDataFlow)是可视化管线的三个基本要素。
每个 VTK 程序都会有可视化管线存在,比如示例RenderCylinder,其可视化管线可以简单地表示成如图所示的连接关系。
示例代码:
cs
private void RenderCylinder()
{
vtkCylinderSource cylinderSource = vtkCylinderSource.New();
cylinderSource.SetHeight(3.0); //设置高
cylinderSource.SetRadius(1.0); // 设置半径
cylinderSource.SetResolution(100); //设置横截面的等边多边形的边数。
vtkPolyDataMapper polyDataMapper = vtkPolyDataMapper.New();
//VTK可视化管线的输入数据接口,对应的可视化管线的输出数据接口为GetOutputPort().
polyDataMapper.SetInputConnection(cylinderSource.GetOutputPort());
vtkActor actor = vtkActor.New();
actor.SetMapper(polyDataMapper); //用于设置生成几何图元的Mapper,即连接一个Actor到可视化管理的末端。
vtkRenderer renderer = vtkRenderer.New();
renderer.AddActor(actor); //将vtkProp类型的对象添加到渲染场景中。
renderer.SetBackground(0.3, 0.6, 0.7); //设置渲染场景的背景颜色,用RGB的格式设置。还有其它函数可以设置渐变效果。
vtkRenderWindow renWin = renderWindowControl.RenderWindow;
renWin.AddRenderer(renderer); // 添加渲染器
renWin.Render();
}
图示:
示例 RenderCylinder 的可视化管线非常简单,先是创建一个柱体数据,接着经Mapper后生成的图元直接送入渲染引警渲染,创建的数据没有经过任何处理。
3、一个复杂的可视化管线
在该示例中,先读入一个后缀为 vk的文件(head.vtk),然后用移动立方体法(vtkMarchingCubes)提取等值面,最后把等值面数据经Mapper送往渲染引擎进行显示(运行结果如图所示)。
示例代码:
cs
//读取Structure_poings类型的vtk文件
vtkStructuredPointsReader reader = vtkStructuredPointsReader.New();
reader.SetFileName("data//head.vtk");
//处理读入的数据。
//用移动立方体提取等值面。 VTK中把与类似vtkMarchingCubes对数据处理的类称为Filter。
vtkMarchingCubes cubes = vtkMarchingCubes.New();
cubes.SetInputConnection(reader.GetOutputPort());
cubes.SetValue(0, 500);
//将生成的等值面数据进行Mapper
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(cubes.GetOutputPort());
//把Mapper的输出送往渲染引擎进行显示
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
vtkRenderer renderer = vtkRenderer.New();
renderer.AddActor(actor);
renderer.SetBackground(0.3, 1, 0.7);
vtkRenderWindow renWin = renderWindowControl.RenderWindow;
renWin.AddRenderer(renderer);
renWin.Render();
reader.Dispose();
cubes.Dispose();
mapper.Dispose();
actor.Dispose();
renderer.Dispose();
效果:
可视化管线: