我正在从事一个涉及从封闭对象中提取中心线的项目。在实现中心线提取算法之前,我必须执行以下处理步骤。我是 openvdb 的新手,因此需要一些帮助。
- 体素化网格。
- 计算每个体素与边界场的距离。
- 迭代体素。
- 访问一个体素的 26 个邻居。
我的尝试
第 1 步和第 2 步 - 为了完成第 1 步和第 2 步,我执行以下操作。a) 读取波前 obj。我为此编写了一个自定义函数,用于填充 Vec3s、Vec3I 和 Vec4I 的向量。b) 将数据传递给以下函数以计算与边界场的距离。
GridType::Ptr meshToSignedDistanceField ( const openvdb::math::Transform & xform, const std::vector< Vec3s > & points, const std::vector< Vec3I > & triangles, const std::vector< Vec4I > & quads, float exBandWidth, float inBandWidth )
我是否使用正确的 api 函数来计算与边界场的距离?如果是这样,我不理解第 5 个(float exBandWidth)和第 6 个(float inBandWdth)参数。关于这些的一些指示会有所帮助。
现在我与边界字段有距离我使用值迭代器在网格上进行迭代,如下所示
for (openvdb::FloatGrid::ValueAllCIter iter = grid->cbeginValueAll(); iter.test(); ++iter) { float dist = iter.getValue(); if (dist > 0.0) { std::cout << "exterior voxel" << std::endl; } else { std::cout << "interior voxel" << std::endl; } }
我的第一个问题是我做这一步对吗??如果是这样,我还想为每个体素访问 26 个邻居。怎么做 ??