首页 > 解决方案 > 如何将 vtkpolydata 转换为 vtkimagedata?

问题描述

在 vtp ( 或 xml? ) 文件中,我有一组点,每个点都有位置 (x,y,z)、质量 (m) 和密度 (rho)。

他们看起来像这样

<?xml version="1.0"?>
<VTKFile type="PolyData" version="0.1" byte_order="LittleEndian" header_type="UInt32" compressor="vtkZLibDataCompressor">
  <PolyData>
    <Piece NumberOfPoints="524288"               NumberOfVerts="0"                    NumberOfLines="0"                    NumberOfStrips="0"                    NumberOfPolys="0"                   >
      <PointData>
        <DataArray type="Float32" Name="vx" format="appended" RangeMin="-10617.716797"        RangeMax="11650.322266"         offset="0"                   />
        <DataArray type="Float32" Name="vy" format="appended" RangeMin="-12008.198242"        RangeMax="11676.560547"         offset="2554076"             />
        <DataArray type="Float32" Name="vz" format="appended" RangeMin="-10880.447266"        RangeMax="11361.508789"         offset="5104080"             />
        <DataArray type="Float32" Name="mass" format="appended" RangeMin="0.16916139424"        RangeMax="0.83083856106"        offset="7655432"             />
        <DataArray type="Float32" Name="uu" format="appended" RangeMin="0"                    RangeMax="117252.91406"         offset="7742064"             />
        <DataArray type="Float32" Name="hh" format="appended" RangeMin="0"                    RangeMax="4.1185030937"         offset="8877700"             />
        <DataArray type="Float32" Name="mu" format="appended" RangeMin="1.2307692766"         RangeMax="1.2307692766"         offset="10032668"            />
        <DataArray type="Float32" Name="rho" format="appended" RangeMin="0"                    RangeMax="49503150080"          offset="10038236"            />
        <DataArray type="Float32" Name="phi" format="appended" RangeMin="-1.3579902649"        RangeMax="1.2645899057"         offset="11265024"            />
        <DataArray type="Int64" Name="id" format="appended" RangeMin="0"                    RangeMax="524287"               offset="13840232"            />
        <DataArray type="UInt16" Name="mask" format="appended" RangeMin="0"                    RangeMax="3"                    offset="15044924"            />
      </PointData>
      <CellData>
      </CellData>
      <Points>
        <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="appended" RangeMin="0.89113022864"        RangeMax="110.020575"           offset="15133592"            />
      </Points>
      <Verts>
        <DataArray type="Int64" Name="connectivity" format="appended" RangeMin=""                     RangeMax=""                     offset="22080132"            />
        <DataArray type="Int64" Name="offsets" format="appended" RangeMin=""                     RangeMax=""                     offset="22080148"            />
      </Verts>
      <Lines>
        <DataArray type="Int64" Name="connectivity" format="appended" RangeMin=""                     RangeMax=""                     offset="22080164"            />
        <DataArray type="Int64" Name="offsets" format="appended" RangeMin=""                     RangeMax=""                     offset="22080180"            />
      </Lines>
      <Strips>
        <DataArray type="Int64" Name="connectivity" format="appended" RangeMin=""                     RangeMax=""                     offset="22080196"            />
        <DataArray type="Int64" Name="offsets" format="appended" RangeMin=""                     RangeMax=""                     offset="22080212"            />
      </Strips>
      <Polys>
        <DataArray type="Int64" Name="connectivity" format="appended" RangeMin=""                     RangeMax=""                     offset="22080228"            />
        <DataArray type="Int64" Name="offsets" format="appended" RangeMin=""                     RangeMax=""                     offset="22080244"            />
      </Polys>
    </Piece>
  </PolyData>
  <AppendedData encoding="base64">
      ...
  </AppendedData>
</VTKFile

我想用它来做一些体积渲染,因此我需要把它作为 ImageData。

我的第一个愚蠢的方法是:使用 avtkXMLImageDataReader而不是 a vtkXMLPolyDataReader。它显然没有用。

我该怎么做才能将其转换为ImageData任何 volumeMapper 或使其与任何 volumeMapper 一起使用?

谢谢

标签: c++vtk

解决方案


使用vtkplotter您可以从一组稀疏点创建一个 vtkVolume 插值:

from vtkplotter import *

mymesh = ... # vtkPolyData with pointdata

vol = interpolateToVolume(Actor(mymesh))

#write(vol, 'output.vti')

show(vol)

这里


推荐阅读