第05章-可视化技术(4)

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】

【本小节内容对应原书的第112页至第117页】

5.3 规则网格可视化

规则网格在拓扑结构上规则,而几何上是不规则的,如图3-2所示。规则网格常被用来进行数据分析(如流体动力学计算)。规则网格vtkStructuredGrid数据集主要有六面体(vtkHexahedral)单元或者是四边形(vtkQuad)单元组成。

手动创建vtkStructedGrid

创建规则网格需要指定网格的维数(定义拓扑结构)和定义x-y-z坐标的vtkPoints对象(定义几何结构)。下面代码改自VTK/Examples/DataManiulation/Cxx/SGrid.cxx。

 

vtkPoints points

   points InsertPoint 0 0.0 0.0 0.0

   …etc…

 

vtkStructedGrid sgrid

   sgrid SetDimensions 13 11 11

   sgrid SetPoints points

 

主要vtkPoints对象中点的个数要与网格i,j和k三个方向的维数乘积保持一致。

提取计算平面

大多数情况下规则网格由接收vtkDataSet类型输入的filter来处理(见89页“可视化技术”)。而直接接收vtkStructuredGrid类型输入的其中一个filter是vtkStructuredGridGeometryFilter。该Filter根据其Extent变量值来提取网格中的局部点、线段或者平面(Extent是一个描述区域的六维向量( , ))。

下例中我们读取了一个规则网格数据,提取其中的三个平面,并利用相关的向量数据对平面进行Warp处理(代码取自VTK/Examples/VisualizationAlgorithms/Tcl/warpComb.tcl)。

 

vtkPLOT3DReader pl3d

    pl3d SetXYZFileName "$VTK_DATA_ROOT/Data/combxyz.bin"

    pl3d SetQFileName "$VTK_DATA_ROOT/Data/combq.bin"

    pl3d SetScalarFunctionNumber 100

    pl3d SetVectorFunctionNumber 202

pl3d Update

vtkStructuredGridGeometryFilter plane

    plane SetInputConnection [pl3d GetOutputPort]

    plane SetExtent 10 10 1 100 1 100

vtkStructuredGridGeometryFilter plane2

    plane2 SetInputConnection [pl3d GetOutputPort]

    plane2 SetExtent 30 30 1 100 1 100

vtkStructuredGridGeometryFilter plane3

    plane3 SetInputConnection [pl3d GetOutputPort]

    plane3 SetExtent 45 45 1 100 1 100

vtkAppendPolyData appendF

    appendF AddInputConnection [plane GetOutputPort]

    appendF AddInputConnection [plane2 GetOutputPort]

    appendF AddInputConnection [plane3 GetOutputPort]

vtkWarpScalar warp

    warp SetInputConnection [appendF GetOutputPort]

    warp UseNormalOn

    warp SetNormal 1.0 0.0 0.0

    warp SetScaleFactor 2.5

vtkPolyDataNormals normals

    normals SetInputConnection [warp GetOutputPort]

    normals SetFeatureAngle 60

vtkPolyDataMapper planeMapper

   planeMapper SetInputConnection [normals GetOutputPort]

    evalplaneMapper SetScalarRange [[pl3d GetOutput] GetScalarRange]

vtkActor planeActor

   planeActor SetMapper planeMapper

规则网格数据降采样

如图像数据一样,规则网格数据也可以进行降采样(见105页“图像数据降采样”)。vtkExtractGrid用来执行数据降采样和提取。

 

vtkPLOT3DReader pl3d

    pl3d SetXYZFileName "$VTK_DATA_ROOT/Data/combxyz.bin"

    pl3d SetQFileName "$VTK_DATA_ROOT/Data/combq.bin"

    pl3d SetScalarFunctionNumber 100

    pl3d SetVectorFunctionNumber 202

    pl3d Update

vtkExtractGrid extract

    extract SetInputConnection [pl3d GetOutputPort]

    extract SetVOI 30 30 -1000 1000 -1000 1000

    extract SetSampleRate 1 2 3

    extract IncludeBoundaryOn

 

在该例子中初始规则网格(维数为57X33X25)按照(1,2,3)的采样率进行采样,生成一个维数(1,17,9)的子集。函数IncludeBoundaryOn()保证了在没有选择边界的采样操作下也将边界提取出来。

5.4 线性网格可视化

线性网格在拓扑上规则,但是在几何上半规则(如图3-2(b))。线性网格也常用于数值分析。vtkRectilinearGrid由体素(vtkVoxel)或者像素(vtkPixel)单元组成。

手动创建vtkRectlinearGrid

线性网格创建需要指定网格维数定义网格拓扑,以及三个标量数组定义x-y-z三个方向坐标来定义几何。下面代码改自VTK/Examples/DataManipulation/Cxx/RGrid.cxx。

 

vtkFloatArray *xCoords = vtkFloatArray::New();

  for (i=0;i<47; i++) xCoords->InsertNextValue(x[i]);

 

  vtkFloatArray*yCoords = vtkFloatArray::New();

  for (i=0;i<33; i++) yCoords->InsertNextValue(y[i]);

 

 vtkFloatArray *zCoords = vtkFloatArray::New();

  for (i=0;i<44; i++) zCoords->InsertNextValue(z[i]);

 

vtkRectilinearGrid *rgrid =vtkRectilinearGrid::New();

   rgrid->SetDimensions(47,33,44);

   rgrid->SetXCoordinates(xCoords);

   rgrid->SetYCoordinates(yCoords);

   rgrid->SetZCoordinates(zCoords);

 

确保x,y,z三个方向的标量个数要与拓扑i,j,k三个方向维数保持一致。

提取计算平面

大多数情况下线性网格由接收vtkDataSet类型输入的Filter来处理(见89页“可视化技术”)。而直接接收vtkRectilinearGrid类型输入的其中一个Filter是vtkRectilinearGridGeometryFilter。该Filter根据其Extent变量值来提取网格中的局部点、线段或者平面(Extent是一个描述区域的六维向量( , ))。

下面例子还是紧接上面代码VTK/Examples/DataManipulation/Cxx/RGrid.cxx,我们如下提取一个平面:

vtkRectilinearGridGeometryFilter *plane =

  vtkRectilinearGridGeometryFilter::New();

plane->SetInput(rgrid);

plane->SetExtent(0,46, 16,16, 0,43);

5.5 不规则网格可视化

不规则网格无论在拓扑上还是几何上都是不规则的(如图3-2(f))。不规则网格常用来进行数值分析(如有限元分析)。任何一中单元类型都可以用来表示不规则网格。

手动创建vtkUnstructuredGrid

不规则网格定义是通过vtkPoints来定义几何,通过插入单元来定义拓扑。(下面代码取自VTK/Examples/DataManipulation/Tcl/BuildUGrid.tcl.)

 

vtkPoints tetraPoints

  tetraPoints SetNumberOfPoints 4

  tetraPoints InsertPoint 0 0 0 0

  tetraPoints InsertPoint 1 1 0 0

  tetraPoints InsertPoint 2 .5 1 0

  tetraPoints InsertPoint 3 .5 .5 1

vtkTetra aTetra

  [aTetra GetPointIds] SetId 0 0

  [aTetra GetPointIds] SetId 1 1

  [aTetra GetPointIds] SetId 2 2

  [aTetra GetPointIds] SetId 3 3

vtkUnstructuredGrid aTetraGrid

  aTetraGrid Allocate 1 1

  aTetraGrid InsertNextCell [aTetra GetCellType] [aTetra GetPointIds]

  aTetraGrid SetPoints tetraPoints

  …insertother cells if any…

 

在为vtkUnstructuredGrid实例插入单元数据前,必须先执行Allocate()函数来分配空间。该函数的两个参数分别表示初始分配的数据空间大小,和需要额外内存时扩展的内存空间大小。一般情况大比较大的值会有较好的效果(因为需要较少的内存重分配操作)。

提取局部网格

大部分情况下,不规则网格由接收vtkDataSet类型输入的Filter处理(见89页“可视化技术”)。直接接收vtkUnstructuredGrid类型输入的其中一个Filter是vtkExtractUnstructuredGrid。这个filter根据指定的点ids,单元ids和几何边界来提取局部网格(Extent参数定义一个包围盒)。下例代码取自VTK/Examples/VisualizationAlgorithms/Tcl/ExtractUGrid.tcl。

vtkDataSetReader reader

    reader SetFileName "$VTK_DATA_ROOT/Data/blow.vtk"

    reader SetScalarsName "thickness9"

    reader SetVectorsName "displacement9"

vtkCastToConcrete castToUnstructuredGrid

   castToUnstructuredGrid SetInputConnection [reader GetOutputPort]

vtkWarpVector warp

  warp SetInput [castToUnstructuredGrid GetUnstructuredGridOutput]

 

vtkConnectivityFilter connect

    connect SetInputConnection [warp GetOutputPort]

    connect SetExtractionModeToSpecifiedRegions

    connect AddSpecifiedRegion 0

    connect AddSpecifiedRegion 1

vtkDataSetMapper moldMapper

   moldMapper SetInputConnection [reader GetOutputPort]

   moldMapper ScalarVisibilityOff

vtkActor moldActor

    moldActorSetMapper moldMapper

    [moldActor GetProperty] SetColor .2 .2 .2

    [moldActor GetProperty] SetRepresentationToWireframe

 

vtkConnectivityFilter connect2

    connect2 SetInputConnection [warp GetOutputPort]

    connect2 SetExtractionModeToSpecifiedRegions

    connect2 AddSpecifiedRegion 2

vtkExtractUnstructuredGrid extractGrid

   extractGrid SetInputConnection [connect2 GetOutputPort]

   extractGrid CellClippingOn

   extractGrid SetCellMinimum 0

   extractGrid SetCellMaximum 23

vtkGeometryFilter parison

    parison SetInputConnection [extractGrid GetOutputPort]

vtkPolyDataNormals normals2

    normals2 SetInputConnection [parison GetOutputPort]

    normals2 SetFeatureAngle 60

vtkLookupTable lut

    lut SetHueRange 0.0 0.66667

vtkPolyDataMapper parisonMapper

   parisonMapper SetInputConnection [normals2 GetOutputPort]

   parisonMapper SetLookupTable lut

   parisonMapper SetScalarRange 0.12 1.0

vtkActor parisonActor

   parisonActor SetMapper parisonMapper

 

该例中我们采用单元裁剪(利用单元id号)和一个连通Filter来提取局部网格。vtkConnectivityFilter(以及vtkPolyDataConnectivityFilter)用来提取数据中的连通部分(当单元共享点时,他们是连通的)。SetExtractionModeToSpecifiedRegions()方法设置提取哪个连通区域。连通filter默认提取最大的连通区域。也可以如该例中那样提取一个特定的区域,不过需要一些额外的实验来对应各个区域。

不规则网格等值线提取

vtkContourGrid用来提取不规则网格的等值线。与一般的vtkContourFilter类相比,这个类更加高效。通常你并不需要直接实例化该类,因为当vtkContourFilter识别到输入数据时vtkUnstructuredGrid类型时,vtkContourFilter内部会自动创建一个vtkContourGrid实例。

以上是可视化技术概述。接下来你可能希望学习图像处理和体绘制技术。也可以参考444页“Filter总结”部分了解VTK中的Filter。


【第5章-可视化技术 翻译完毕】

你可能感兴趣的:(VTK,User's,Guide,–,中文版,VTK,User's,Guide,中文版)