1

我正在从事一个涉及从封闭对象中提取中心线的项目。在实现中心线提取算法之前,我必须执行以下处理步骤。我是 openvdb 的新手,因此需要一些帮助。

  1. 体素化网格。
  2. 计算每个体素与边界场的距离。
  3. 迭代体素。
  4. 访问一个体素的 26 个邻居。

我的尝试

  1. 第 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)参数。关于这些的一些指示会有所帮助。

  1. 现在我与边界字段有距离我使用值迭代器在网格上进行迭代,如下所示

    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 个邻居。怎么做 ??

4

0 回答 0