thanks for your reply. Yes, these are volumetric OpenVDB data. I wrote a very simple C++ code that converts the vtkImageData and its vtkFloatArray to openvdb FloatGrid (I am attaching the code below). In Python, the procedure would be very similar I believe.
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkPointData.h>
#include <vtkXMLImageDataReader.h>
#include <vtkFloatArray.h>
#include <openvdb/openvdb.h>
#include <string>
#include <iostream>
int main(int argc, char** argv) {
if(argc < 4) {
std::cerr << "usage: " << argv[0] << " <input> <output> <array>" << std::endl;
return -1;
}
std::string input = argv[1];
std::string output = argv[2];
std::string array = argv[3];
openvdb::initialize();
openvdb::FloatGrid::Ptr grid = openvdb::FloatGrid::create();
grid->setGridClass(openvdb::GRID_LEVEL_SET);
grid->setName(array.data());
openvdb::FloatGrid::Accessor accessor = grid->getAccessor();
openvdb::Coord ijk;
auto reader = vtkSmartPointer<vtkXMLImageDataReader>::New();
reader->SetFileName(input.data());
reader->Update();
vtkSmartPointer<vtkImageData> vtk_grid = reader->GetOutput();
vtkSmartPointer<vtkFloatArray> vtk_array = vtkFloatArray::SafeDownCast(vtk_grid->GetPointData()->GetArray(array.data()));
auto dims = vtk_grid->GetDimensions();
int &i = ijk[0], &j = ijk[1], &k = ijk[2];
for(k = 0; k < dims[2]; ++k) {
for(j = 0; j < dims[1]; ++j) {
for(i = 0; i < dims[0]; ++i) {
accessor.setValue(ijk, vtk_array->GetTuple1(i + j*dims[0] + k*(dims[0]*dims[1])));
}
}
}
openvdb::io::File(output.data()).write({grid});
return 0;
}