1.VTK图像处理引言
图像数据的应用非常广泛,最近使用日常生活的应用是3D游戏,其中每一个角色的模型、场景等都是图形数据。当然,游戏仅仅是图像数据的一个应用点。图形在CAD(计算机辅助设计)、影视、医学、地质、气象数据建模等领域中均有着广泛的应用。
VTKPolyData是VTK中常用的数据结构之一,可以表示小到一个点、一条线,大到一个模型、一个场景等。
2.vtkPolyData数据的生成与显示
vtkPolyData主要由几何结构、拓扑结构、属性结构组成。
几何结构:组成模型的点集;
拓扑结构数据:这些点根据一定的连接关于组成的单元数据;表明集合点集之间的饿拓扑关系;
属性数据:与几何结构数据相关联,属性可以是标量、向量或者是张量。
可以是其中的每个店曲率属性数据,也可以为其中的每一个单元定义一个法向量属性数据。在vtkPolyData可视化中会利用这些数据直接或间接计算单元或点的颜色。
3.实例
下述代码中,用VTKConeSource类定义了一个锥形图形数据,其输入为VTKPolyData类型数据
vtkPolyData的成员函数GetNumberOfPonits()和GetNumberOfCell分别获取数据的点数和单元数目。
然后是定义一个图形数据的渲染管线,包括VTKPolyDataMapper()、vtkActor()、VTKReader()、vtkRenderWindow()和vtkRenderWindowInteractor()。这个渲染流程和图像渲染管线基本一致。需要注意的是,对于vtkPolyData类型数据的渲染管线、需要定义VTKPolyDataMapper对象,用于VTKPolydata图形数据以显示图像时数据到渲染图元的转换。
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkSmartPointer.h>
#include <vtkConeSource.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main()
{
vtkSmartPointer<vtkConeSource> coneSource =
vtkSmartPointer<vtkConeSource>::New();
coneSource->Update();
vtkSmartPointer<vtkPolyData> polyData =
vtkSmartPointer<vtkPolyData>::New();
polyData = coneSource->GetOutput();
int nPoints = polyData->GetNumberOfPoints();
int nCells = polyData->GetNumberOfCells();
std::cout << "几何数据(点数):" << nPoints << std::endl;
std::cout << "拓扑数据(单元):" << nCells << std::endl;
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polyData);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> render =
vtkSmartPointer<vtkRenderer>::New();
render->AddActor(actor);
render->SetBackground(10, 0, 0);
vtkSmartPointer<vtkRenderWindow> rw =
vtkSmartPointer<vtkRenderWindow>::New();
rw->AddRenderer(render);
rw->SetSize(640, 480);
rw->SetWindowName("PolyData Structure Learning");
rw->Render();
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetRenderWindow(rw);
rwi->Initialize();
rwi->Start();
return 0;
}