openvdb::Vec3f Center(0.0f, 0.0f, 0.0f);
float radius = 7.0f;float shift = 2 * radius / 3;openvdb::Vec3f sCenter(Center.x() + shift, Center.y(), Center.z());
auto a = openvdb::tools::createLevelSetSphere<openvdb::Grid<openvdb::FloatTree>>(radius, Center, 0.1);
openvdb::tools::pruneLevelSet(a->tree());
auto b = openvdb::tools::createLevelSetSphere<openvdb::Grid<openvdb::FloatTree>>(radius, sCenter, 0.1);
openvdb::tools::pruneLevelSet(b->tree());
openvdb::FloatGrid::Ptr CenterSphere = a->deepCopy();CenterSphere->setName("Center Sphere");
openvdb::FloatGrid::Ptr ShiftedSphere = b->deepCopy();ShiftedSphere->setName("Shifted Sphere");
openvdb::FloatGrid::Ptr Union = openvdb::tools::csgUnionCopy<openvdb::Grid<openvdb::FloatTree>>(*a, *b);Union->setName("Union");
openvdb::FloatGrid::Ptr iDelta = openvdb::tools::csgDifferenceCopy<openvdb::Grid<openvdb::FloatTree>>(*Union, *a);iDelta->setName("Initial Delta");
openvdb::FloatGrid::Ptr fDelta = openvdb::tools::csgIntersectionCopy<openvdb::Grid<openvdb::FloatTree>>(*iDelta, *b);fDelta->setName("final Delta");
openvdb::FloatGrid::Ptr pfDelta = fDelta->deepCopy();openvdb::tools::pruneLevelSet(pfDelta->tree());
pfDelta->setName("pruned final Delta");
openvdb::FloatGrid::Ptr iUndoUnion = openvdb::tools::csgDifferenceCopy<openvdb::Grid<openvdb::FloatTree>>(*Union, *pfDelta);iUndoUnion->setName("Undo Union");while the result is much better its not there yet .
In addition the process of performing levelSetRebuild is expansive time-wise and memory-wise at each CSG stage,also depending on the grid dimensions , complexity and most important voxel ratio to the real world, here 0.1.
Is there a different approach handling the situation , that is better recommended.
I've looked into the topology and compMin ,compSum directions but i think i'm missing it.
adding my updated code below :
float radius = 7.0f;float shift = 2 * radius / 3;openvdb::Vec3f sCenter(Center.x() + shift, Center.y(), Center.z());
auto a = openvdb::tools::createLevelSetSphere<openvdb::Grid<openvdb::FloatTree>>(radius, Center, 0.1);
openvdb::tools::pruneLevelSet(a->tree());
auto b = openvdb::tools::createLevelSetSphere<openvdb::Grid<openvdb::FloatTree>>(radius, sCenter, 0.1);
openvdb::tools::pruneLevelSet(b->tree());
openvdb::FloatGrid::Ptr CenterSphere = a->deepCopy();
CenterSphere->setName("Center Sphere");
openvdb::FloatGrid::Ptr ShiftedSphere = b->deepCopy();ShiftedSphere->setName("Shifted Sphere");
openvdb::FloatGrid::Ptr tmpU = openvdb::tools::csgUnionCopy<openvdb::Grid<openvdb::FloatTree>>(*a, *b);tmpU->setName("U'");openvdb::FloatGrid::Ptr rtmpU = openvdb::tools::levelSetRebuild(*tmpU);rtmpU->setName("rebuilt U'"); /* I've ditched this stage */
openvdb::FloatGrid::Ptr delta = openvdb::tools::csgDifferenceCopy<openvdb::Grid<openvdb::FloatTree>>(*tmpU, *a);delta->setName("Delta");openvdb::FloatGrid::Ptr rDelta = openvdb::tools::levelSetRebuild(*delta);rDelta->setName("rebuilt Delta");
openvdb::FloatGrid::Ptr U = openvdb::tools::csgUnionCopy<openvdb::Grid<openvdb::FloatTree>>(*a, *rDelta);U->setName("U");
openvdb::FloatGrid::Ptr Undo = openvdb::tools::csgDifferenceCopy<openvdb::Grid<openvdb::FloatTree>>(*U, *rDelta);Undo->setName("Undo");openvdb::FloatGrid::Ptr rUndo = openvdb::tools::levelSetRebuild(*Undo);rUndo->setName("rebuilt Undo");
also i would not mind more elaborate explanation regarding SDF , Narrow - Bend and CSG or a reference to good material.
thanks,
Dor
also i would not mind more elaborate explanation regarding SDF , Narrow - Bend and CSG or a reference to good material.