BVTKNodes gallery

@tkeskita,

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;
}
1 Like