vtkファイルフォーマット(バイナリ形式)

バイナリ形式によるvtkファイルのフォーマットがやっとわかったので書き留めておく。
意外と日本語で解説している人、いないのよね…。


また、日本語サイトでちらほら見つかるアスキー形式のvtkファイルも、ほぼ全てがレガシーなフォーマット(.vtk)の解説になっている。

最新のvtk形式はxmlによる記述を採用しており、可視化する形状の種類(画像、構造格子、非構造格子、etc.)によって拡張子を変えている(vti,vtuなど)。
ここでは最新のフォーマットについて少しだけ解説する。



基本的な形式は下記のサイトの後半に書かれており、アスキー形式でよければすぐ理解できると思う。
VTK File Formats


サンプルコードは下記の通り。見た目だけでこれのみでは可視化不能。ちなみにこれはImageDataなので拡張子はvtiである。

<?xml version="1.0"?>
<VTKFile type="ImageData" version="1.0" byte_order="LittleEndian" header_type="UInt64">
  <ImageData WholeExtent= "Xmin Xmax Ymin Ymax Zmin Zmax" Origin= "x0 y0 z0" Spacing= "dx dy dz">
    <Piece Extent= "Pxmin Pxmax Pymin Pymax Pzmin Pzmax" > 
      <PointData>
      </PointData>
      <CellData Scalars="Scalar">
        <DataArray type="Float32" Name="Scalar" format="appended" RangeMin="minValue" RangeMax="maxValue" offset="0">
        </DataArray>
      </CellData>
    </Piece>
  </ImageData>
  <AppendedData encoding="raw">

    _NNNN(Data(Binary))

  </AppendedData>
</VTKFile>


ヘッダ部の変数は直観的にだいたい想像がつくので解説は割愛。
これは画像だが直交格子を使った計算などならこれでも対応できると思われる。

可視化したいデータをAppendedとして、最後にまとめて貼り付ければいいのでコーディングも割と楽だと思う。

ただ、注意として、
・データの頭に必ずアンダーバー(_)を配置しないといけないこと
・8バイト(もしくは4)のint型で、dataの総バイト数を記述すること(下記NNNN)4か8かは二行目のheader_typeに依存。UInt64なら8.
を忘れてはならない。encodingをrawとしているためこれは必須。

上記サイトにも注意があるかもしれないが、おそらく見落としていた。
偶然見つけた下記がなければまだ悩んでいたと思われる。感謝。
'Re: [Paraview] VTK XML Binary Output' - MARC
What they don’t tell you about VTK XML binary formats
VTK XML Formats - KitwarePublic