前言
“VTK图形图像开发进阶_张晓东_罗火灵”的学习笔记。
东灵工作室 教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686
学习资料
VTK官网学习地址:https://vtk.org/doc/nightly/html/
一、vtkPolyData数据生成与显示
由【QT+VTK 学习笔记】04:VTK基本数据结构可知
vtkPolyData主要由几何结构数据、拓扑结构数据和属性数据组成。 几何结构数据主要是组成模型的点集;拓扑结构数据则是由这些点根据一定的连接关系组成的单元数据,表明了几何点集之间的拓扑关系;而属性数据与几何结构数据和拓扑结构数据 相关联,属性数据可以是标量、向量或者张量。
1.1vtkPolyData数据源
下表列出了常见的几种vtkPolyData数据源类。
1.2vtkPolyData 数据的创建
#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSmartPointer.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <iostream>
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(0.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 1.0, 0.0);
points->InsertNextPoint(0.0, 1.0, 0.0);
points->InsertNextPoint(2.0, 0.0, 0.0);
//生成正方形 多边形单元
vtkSmartPointer<vtkPolygon> polygon =
vtkSmartPointer<vtkPolygon>::New();
polygon->GetPointIds()->SetNumberOfIds(4);
polygon->GetPointIds()->SetId(0, 0);
polygon->GetPointIds()->SetId(1, 1);
polygon->GetPointIds()->SetId(2, 2);
polygon->GetPointIds()->SetId(3, 3);
//生成三角形 多边形单元
vtkSmartPointer<vtkTriangle> trianle =
vtkSmartPointer<vtkTriangle>::New();
trianle->GetPointIds()->SetId(0, 1);
trianle->GetPointIds()->SetId(1, 2);
trianle->GetPointIds()->SetId(2, 4);
//存储所有单元数据
vtkSmartPointer<vtkCellArray> cells =
vtkSmartPointer<vtkCellArray>::New();
cells->InsertNextCell(polygon);
cells->InsertNextCell(trianle);
vtkSmartPointer<vtkPolyData> polygonPolyData =
vtkSmartPointer<vtkPolyData>::New();
polygonPolyData->SetPoints(points); //设置点数据
/*
SetPolys接受的是多边形单元数组,如果是单元类型为顶点,线段或者 三角形带的话,则调用如下函数:
void SetVerts (vtkCellArray* v);
void SetLines (vtkCellArray* 1); void SetStrips (vtkCellArray* s);
*/
polygonPolyData->SetPolys(cells); //设置单元数据
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polygonPolyData);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(0.5, 0.5, 0.5);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize( 640, 480 );
renderWindow->Render();
renderWindow->SetWindowName("PolyDataNew");
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
1.3vtkPolyData 属性数据
属性数据包括点属性和单元属性,可为vtkPolyData的点数据和单元数据分别指定属性数据。而属性数据可以是标量,如点的曲率;也可以是向量,如点或者单元的法向量;也可以是张量,主要在流场中较为常见。颜色可以直接作为一种标量属性数据,设置到相应的点或者单元数据中,这也是最直接的种图形着色方式。
#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSmartPointer.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLookupTable.h>
#include <vtkTransformTextureCoords.h>
#include <iostream>
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(0.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 1.0, 0.0);
points->InsertNextPoint(0.0, 1.0, 0.0);
points->InsertNextPoint(2.0, 0.0, 0.0);
//生成正方形 多边形单元
vtkSmartPointer<vtkPolygon> polygon =
vtkSmartPointer<vtkPolygon>::New();
polygon->GetPointIds()->SetNumberOfIds(4);
polygon->GetPointIds()->SetId(0, 0);
polygon->GetPointIds()->SetId(1, 1);
polygon->GetPointIds()->SetId(2, 2);
polygon->GetPointIds()->SetId(3, 3);
//生成三角形 多边形单元
vtkSmartPointer<vtkTriangle> trianle =
vtkSmartPointer<vtkTriangle>::New();
trianle->GetPointIds()->SetId(0, 1);
trianle->GetPointIds()->SetId(1, 2);
trianle->GetPointIds()->SetId(2, 4);
//存储所有单元数据
vtkSmartPointer<vtkCellArray> cells =
vtkSmartPointer<vtkCellArray>::New();
cells->InsertNextCell(polygon);
cells->InsertNextCell(trianle);
vtkSmartPointer<vtkPolyData> polygonPolyData =
vtkSmartPointer<vtkPolyData>::New();
polygonPolyData->SetPoints(points); //设置点数据
/*
SetPolys接受的是多边形单元数组,如果是单元类型为顶点,线段或者 三角形带的话,则调用如下函数:
void SetVerts (vtkCellArray* v);
void SetLines (vtkCellArray* 1); void SetStrips (vtkCellArray* s);
*/
polygonPolyData->SetPolys(cells); //设置单元数据
unsigned char red[3] = {255, 0, 0};
unsigned char green[3] = {0, 255, 0};
unsigned char blue[3] = {0, 0, 255};
vtkSmartPointer<vtkUnsignedCharArray> pointColors =
vtkSmartPointer<vtkUnsignedCharArray>::New();
pointColors->SetNumberOfComponents(3); //设置rbg三通道组分
pointColors->InsertNextTypedTuple(red);
pointColors->InsertNextTypedTuple(green);
pointColors->InsertNextTypedTuple(blue);
pointColors->InsertNextTypedTuple(green);
pointColors->InsertNextTypedTuple(red);
polygonPolyData->GetPointData()->SetScalars(pointColors);
vtkSmartPointer<vtkUnsignedCharArray> cellColors =
vtkSmartPointer<vtkUnsignedCharArray>::New();
cellColors->SetNumberOfComponents(3);
cellColors->InsertNextTypedTuple(red);
cellColors->InsertNextTypedTuple(green);
polygonPolyData->GetCellData()->SetScalars(cellColors);
vtkSmartPointer<vtkIntArray> pointfield =
vtkSmartPointer<vtkIntArray>::New();
pointfield->SetName("Field");
pointfield->SetNumberOfComponents(3);
pointfield->InsertNextTuple3(1,0,0);
pointfield->InsertNextTuple3(2,0,0);
pointfield->InsertNextTuple3(3,0,0);
pointfield->InsertNextTuple3(4,0,0);
pointfield->InsertNextTuple3(5,0,0);
polygonPolyData->GetPointData()->AddArray(pointfield);
vtkSmartPointer<vtkLookupTable> lut =
vtkSmartPointer<vtkLookupTable>::New();
lut->SetNumberOfTableValues(10);
lut->Build();
lut->SetTableValue(0 , 0 , 0 , 0, 1);
lut->SetTableValue(1, 0.8900, 0.8100, 0.3400, 1);
lut->SetTableValue(2, 1.0000, 0.3882, 0.2784, 1);
lut->SetTableValue(3, 0.9608, 0.8706, 0.7020, 1);
lut->SetTableValue(4, 0.9020, 0.9020, 0.9804, 1);
lut->SetTableValue(5, 1.0000, 0.4900, 0.2500, 1);
lut->SetTableValue(6, 0.5300, 0.1500, 0.3400, 1);
lut->SetTableValue(7, 0.9804, 0.5020, 0.4471, 1);
lut->SetTableValue(8, 0.7400, 0.9900, 0.7900, 1);
lut->SetTableValue(9, 0.2000, 0.6300, 0.7900, 1);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polygonPolyData);
//mapper->SetScalarModeToUseCellData();
//mapper->SetScalarModeToUsePointFieldData();
//mapper->ColorByArrayComponent("Field", 0);
//mapper->SelectColorArray("Field");
//mapper->SetScalarRange(1,5);
mapper->SetLookupTable(lut);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(1.0,1.0,1.0);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize( 640, 480 );
renderWindow->Render();
renderWindow->SetWindowName("PolyDataColor");
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSmartPointer.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkFloatArray.h>
#include <vtkPlaneSource.h>
#include <vtkCellDataToPointData.h>
#include <vtkPointDataToCellData.h>
#include <vtkDataSet.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLookupTable.h>
#include <iostream>
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkPlaneSource> gridSource =
vtkSmartPointer<vtkPlaneSource>::New();
gridSource->SetXResolution(3);
gridSource->SetYResolution(3);
gridSource->Update();
vtkSmartPointer<vtkPolyData> grid = gridSource->GetOutput();
vtkSmartPointer<vtkFloatArray> cellScalars =
vtkSmartPointer<vtkFloatArray>::New();
vtkSmartPointer<vtkFloatArray> cellVectors =
vtkSmartPointer<vtkFloatArray>::New();
cellVectors->SetNumberOfComponents(3);
for (int i = 0; i < 9; i++)
{
cellScalars->InsertNextValue(i + 1); //插入标量数据
cellVectors->InsertNextTuple3(0.0, 0.0, 1.0); //插入向量数据
}
grid->GetCellData()->SetScalars(cellScalars);
grid->GetCellData()->SetVectors(cellVectors);
vtkSmartPointer<vtkLookupTable> lut =
vtkSmartPointer<vtkLookupTable>::New();
lut->SetNumberOfTableValues(10);
lut->Build();
lut->SetTableValue(0 , 0 , 0 , 0, 1);
lut->SetTableValue(1, 0.8900, 0.8100, 0.3400, 1);
lut->SetTableValue(2, 1.0000, 0.3882, 0.2784, 1);
lut->SetTableValue(3, 0.9608, 0.8706, 0.7020, 1);
lut->SetTableValue(4, 0.9020, 0.9020, 0.9804, 1);
lut->SetTableValue(5, 1.0000, 0.4900, 0.2500, 1);
lut->SetTableValue(6, 0.5300, 0.1500, 0.3400, 1);
lut->SetTableValue(7, 0.9804, 0.5020, 0.4471, 1);
lut->SetTableValue(8, 0.7400, 0.9900, 0.7900, 1);
lut->SetTableValue(9, 0.2000, 0.6300, 0.7900, 1);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(grid);//使用网格单元属性数据
// //测试单元属性数据转点属性数据
// vtkSmartPointer<vtkCellDataToPointData> convert =
// vtkSmartPointer<vtkCellDataToPointData>::New();
// convert->SetInputData(grid);
// convert->SetPassCellData(true);
// convert->Update();
// mapper->SetInputData((vtkPolyData*)convert->GetOutput());
//SetScalarRange() 指定了颜色映射范围的最小值和最大值,当标量值大于最大值时,按定义的最大值获取颜色; 当小于最小值时,按指定的最小值获取颜色。
mapper->SetScalarRange(0, 9);
mapper->SetLookupTable(lut);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(1.0,1.0,1.0);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize( 640, 480 );
renderWindow->Render();
renderWindow->SetWindowName("PolyDataAttribute");
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
由于可以同时为点和单元设置属性,那么怎样用点或单元控制颜色呢?这就需要使用 vtkPolyDataMapper 类的方法。
•SetScalarModeToDefault()默认设置。该设置下首先使用点标量数据控制颜色。当点 标量数据不可用时,如果存在可用的单元数据,则以单元数据为准。
•SetScalarModeToUsePointData()。该设置下使用点标量数据着色。如果点标量数据不可 用,也不会使用其他标量数据着色。
•SetScalarModeToUseCellData()»该设置下使用单元标量数据着色。如果单元标量数据 不可用,也不会使用其他标量数据着色。
•SetScalarModeToUsePointFieldData()/SetScalarModeToUseCellFieldData()该设置下点标量数据和单元标量数据都不会用来着色,而是使用点属性数据中的场数据数组。
二、基本的图形操作
VTK中提供了多种图形的基本操作,其中最简单的是点的欧式距离计算,可以使用 vtkMath进行计算,也可以直接计算向量的模。
一些图元类提供了许多可以方便使用的静态函数,如
1.vtkLine提供了点与线间的距离计算、线与线间的距离计算等;
2.vtkTriangle提供了面积、 外接圆、法向量的计算,点与三角形位置关系的判断等;3.vtkPolygen中提供了法向量、重心、 面积的计算、点与多边形位置判断、点与多边形距离、多边形与多边形相交判断等;
4.vtkTetra 中实现了四面体体积、重心计算等。
5.vtkMassProperties这个类可以实现三角网格的表面积和体积的计算,但是要求网格必须是封闭的三角形网格数据,程序演示如下。
#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSmartPointer.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkScalarBarActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkCubeSource.h>
#include <vtkProperty.h>
#include <vtkTriangleFilter.h>
#include <vtkMassProperties.h>
#include <vtkConeSource.h>
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkConeSource> cubeSource =
vtkSmartPointer<vtkConeSource>::New();
cubeSource->Update();
vtkSmartPointer<vtkTriangleFilter> triFilter =
vtkSmartPointer<vtkTriangleFilter>::New();
triFilter->SetInputData(cubeSource->GetOutput());
triFilter->Update();
//计算三角网格模型面积、体积
vtkSmartPointer<vtkMassProperties> massProp =
vtkSmartPointer<vtkMassProperties>::New();
massProp->SetInputData(triFilter->GetOutput());
float vol = massProp->GetVolume(); //网格的体积
float area= massProp->GetSurfaceArea(); //表面积
float maxArea = massProp->GetMaxCellArea(); //最大单元面积
float minArea = massProp->GetMinCellArea(); //最小单元面积
std::cout<<"Volume :"<<vol<<std::endl;
std::cout<<"Surface Area:"<<area<<std::endl;
std::cout<<"Max Area :"<<maxArea<<std::endl;
std::cout<<"Min Area :"<<minArea<<std::endl;
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
//mapper->SetInputData(cubeSource->GetOutput());
mapper->SetInputData(triFilter->GetOutput());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(0,1,0);
actor->GetProperty()->SetEdgeColor(1,0,0);
actor->GetProperty()->SetEdgeVisibility(1);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(1.0,1.0,1.0);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize( 640, 480 );
renderWindow->Render();
renderWindow->SetWindowName("PolyDataMassProperty");
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
三维网格测地距离
对于三维网格模型来讲,测地距离也是一种重要的距离度量。与欧氏距离不同,一个三维模型上的亮点测地距离是指沿着模型表面两者之间的最短距离。测地距离通常采用Dijkstra算法类近似求解。VTK中的vtkDijkstraGraphGeodesicPath类就可以实现测地距离的求解。
#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSphereSource.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkDijkstraGraphGeodesicPath.h>
int main(int , char *[])
{
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
vtkSmartPointer<vtkDijkstraGraphGeodesicPath> dijkstra =
vtkSmartPointer<vtkDijkstraGraphGeodesicPath>::New();
dijkstra->SetInputData(sphereSource->GetOutput());
//计算测地距离时,指定球面上两个点的索引号
dijkstra->SetStartVertex(0); //设置开始点
dijkstra->SetEndVertex(9); //设置结束点
dijkstra->Update();
vtkSmartPointer<vtkPolyDataMapper> pathMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
pathMapper->SetInputData(dijkstra->GetOutput());
vtkSmartPointer<vtkActor> pathActor =
vtkSmartPointer<vtkActor>::New();
pathActor->SetMapper(pathMapper);
pathActor->GetProperty()->SetColor(1,0,0);
pathActor->GetProperty()->SetLineWidth(4);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(sphereSource->GetOutput());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->AddActor(pathActor);
renderer->SetBackground(1.0, 1.0, 1.0);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize( 640, 480 );
renderWindow->Render();
renderWindow->SetWindowName("PolyDataGeodesic");
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
三维图像的包围盒
包围盒是指能够包围模型的最小立方体,常常用于模型的碰撞测量中。vtkPolyData中定义了函数GetBounds()来获取包围盒的参数。即三个坐标轴方向上的最大、最小值。仅仅获取这些参数并不直观,有时候还需要显示包围盒。vtkOutlineFilter则提供了一个方便的方法来生成包围盒,其输入为一个vtkPolyData莫形数据,输出同样为一个vtkPolyData类型数据,因此非常容易进行可视化显示。
#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkProperty.h>
#include <vtkOutlineFilter.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main()
{
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(5.0);
sphereSource->Update();
vtkPolyData* sphere = sphereSource->GetOutput();
vtkSmartPointer<vtkOutlineFilter> outline =
vtkSmartPointer<vtkOutlineFilter>::New();
outline->SetInputData(sphere);
outline->Update();//算法执行完毕,必须更新!!!
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(sphere);
vtkSmartPointer<vtkPolyDataMapper> outlineMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
outlineMapper->SetInputData(outline->GetOutput());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkActor> outlineActor =
vtkSmartPointer<vtkActor>::New();
outlineActor->SetMapper(outlineMapper);
outlineActor->GetProperty()->SetColor(0, 1, 0);
outlineActor->GetProperty()->SetLineWidth(3);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->AddActor(outlineActor);
renderer->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderWindow> rw =
vtkSmartPointer<vtkRenderWindow>::New();
rw->AddRenderer(renderer);
rw->SetSize(640, 480);;
rw->SetWindowName("PolyData Bounding Box");
rw->Render();
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetRenderWindow(rw);
rwi->Start();
return 0;
}