VTK文件格式,多边形和矢量字段

时间:2012-04-26 14:36:32

标签: vtk

我需要将简单几何和矢量字段导出到某些VTK文件。我已设法导出几何体,但我很想知道如何导出矢量场。我需要的文件的结构/格式是什么?

这是我到目前为止(顺便说一下,矢量需要任意放置,这意味着结构化的网格等不起作用):

<?xml version="1.0"?>

<VTKFile type="PolyData" version="0.1" byte_order="LittleEndian">
  <PolyData>
    <Piece NumberOfPoints="8" NumberOfVerts="0" NumberOfLines="0" NumberOfStrips="0" NumberOfPolys="5">
      <Points>
        <DataArray type="Float32" NumberOfComponents="3" format="ascii">
        //point data//
        </DataArray>
      </Points>

      <Polys>
        <DataArray type="Int32" Name="connectivity" format="ascii">
        //connectivity data//
        </DataArray>

        <DataArray type="Int32" Name="offsets" format="ascii">
        //offsett data//
        </DataArray>
      </Polys>

    </Piece>
      //Need to put vector field with it's own points here//
  </PolyData>
</VTKFile>

更新:在Chris提出建议后(请参阅下面的回答)我已将文件更新为此表单:

<?xml version="1.0"?>

<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">
  <UnstructuredGrid>
    <Piece NumberOfPoints="50" NumberOfCells="0">
      <PointData Vectors="Velocity">
        <DataArray Vectors="Velocity">
          //vector data//
        </DataArray>
      </PointData>
      <Points>
        <DataArray type="Float32" NumberOfComponents="3" format="ascii">
          //point data//
        </DataArray>
      </Points>
      <Cells/>
     <CellData/>
   </Piece>
 </UnstructuredGrid>
</VTKFile>

1 个答案:

答案 0 :(得分:1)

从您的示例XML文件中可以看出,矢量字段是在PolyData节点的不同坐标处定义的。如果是这种情况,那么您将需要使用两个不同的文件。来自VTK文件格式规范,它是VTK用户指南的一部分(参见www.vtk.org/VTK/img/file-formats.pdf):

  

按照惯例,每种数据类型和文件类型都与特定的文件扩展名配对。

您的矢量字段听起来像UnstructuredGrid数据,您必须明确指定网格节点的坐标(与ImageGrid s不同,其中节点坐标由间距隐式定义,并且数据范围)。这显然无法进入PolyData VTK文件(请参阅示例XML文件的第二行)。

因此,尝试使用大纲(取自文件格式文档)为您的矢量数据编写一个新文件:

<VTKFile type="UnstructuredGrid" ...>
  <UnstructuredGrid>
    <Piece NumberOfPoints="#" NumberOfCells="0">
      <Points>
          <DataArray type="Float32" NumberOfComponents="3" format="ascii">
          //point data//
          </DataArray>
      </Points>
      <Cells>
          <DataArray type="Int32" Name="connectivity" .../>
          <DataArray type="Int32" Name="offsets" .../>
          <DataArray type="UInt8" Name="types" .../>
      </Cells>
      <PointData>
          <DataArray Vectors="MyVector">
            //Vector data goes here//
          </DataArray>
      </PointData>
      <CellData/>
    </Piece>
  </UnstructuredGrid>
</VTKFile>

更新:正如评论中所讨论的,必须指定Cells元素(CellData元素可以留空,因为只有点数据被指定)。 Cells元素指定单元格类型,连接和偏移。对于一系列未连接的点(即粒子),此信息被指定为长度为n的数组,其中n是数据点的数量,其中

type = 1, 1, .... 1
connectivity = 0, 1, 2, ... n
offsets = 1, 2, 3, ... n