openvdb levelSetRebuild() creates empty grid

30 Views Asked by At

I'm new to OpenVDB and confused why levelSetRebuild() is not working for me.

I'm creating a level set cube, converting it to a fog volume, then converting it back to a level set. The second level set is empty. What am I missing here? MRE follows:

#include <iostream>
#include <openvdb/openvdb.h>
#include <openvdb/tools/LevelSetPlatonic.h>
#include <openvdb/tools/LevelSetRebuild.h>
#include <openvdb/tools/LevelSetUtil.h>

int main()
{
    auto obj1 = openvdb::tools::createLevelSetCube<openvdb::FloatGrid>(50.f, {});
    openvdb::tools::sdfToFogVolume<openvdb::FloatGrid>(*obj1);
    auto obj2 = openvdb::tools::levelSetRebuild<openvdb::FloatGrid>(*obj1);
    std::cout << "Active voxels: " << obj2->activeVoxelCount() << std::endl;
}

Output is: Active voxels: 0

1

There are 1 best solutions below

0
On

I have solved the problem. levelSetRebuild(), if being constructed from a fog volume (i.e., not a level set or signed distance field), should be passed an additional parameter of 0.01. Fixed MRE:

#include <iostream>
#include <openvdb/openvdb.h>
#include <openvdb/tools/LevelSetPlatonic.h>
#include <openvdb/tools/LevelSetRebuild.h>
#include <openvdb/tools/LevelSetUtil.h>
#include <openvdb/tools/VolumeToMesh.h>

int main()
{
    auto obj1 = openvdb::tools::createLevelSetCube<openvdb::FloatGrid>(50.f, {});
    openvdb::tools::sdfToFogVolume<openvdb::FloatGrid>(*obj1);
    auto obj2 = openvdb::tools::levelSetRebuild<openvdb::FloatGrid>(*obj1, 0.01f);
    std::cout << "Active voxels: " << obj2->activeVoxelCount() << std::endl;
}

Output is Active voxels: 8958352