首先,如何使用openvdb查找最近的点?

第二,如果ClosestSurfacePoint是正确的方法,该如何使用?

我阅读了有关使用OpenVDB获得更快的NNS的ICP的论文。

(http://www.pmavridis.com/research/efficient_sparse_icp/)

作者说,他通过将openvdb用于NNS来提高了速度。

还有一些其他人以类似的方式实现了同一件事。

所以,我想亲自尝试一下。

经过几次尝试,我终于成功编译了。

但是,我有点困惑。

在我看来(在阅读了很多文档,包括在线食谱之后),采样器似乎做到了这一点

所以,我尝试了这些例子。

GridType::ConstAccessor accessor = grid.getConstAccessor();
GridType::ValueType v0 = openvdb::tools::PointSampler::sample(accessor, ijk);
GridType::ValueType v1 = openvdb::tools::BoxSampler::sample(accessor, ijk);
GridType::ValueType v2 = openvdb::tools::QuadraticSampler::sample(accessor, ijk);

我做了如下所述的事情

对象:网格中最靠近查询点的查找点(ijk)
  • 创建点(或加载点)并转换为vec3d格式
  • 做点索引网格。
  • 设置查询点(ijk)
  • 设置索引网格
  • 的访问器
    点采样器的
  • 函数调用

  • 但是,这些示例显示0或1。

    如果找到完全相同的位置,则返回1。
    如果不是,则为0。

    可能,该点采样器不是我想要的。

    尝试其他方式。

    其他候选人是
     ClosestSurfacePoint, ClosestPointProjector.
    

    我尝试了下面写的代码
    与betajippity的作品相似
    https://github.com/betajippity/Ariel/blob/master/src/grid/levelset.cpp

    但是由于 vector 而导致错误
    std::vector<openvdb::Vec3s> positions = {
            { 1, 1, 1 },
            { 1, 2, 1 },
            { 2, 1, 1 },
            { 2, 2, 1 },
            { 100, 100, 100 },
            { 100, 101, 100 }
        };
    
    myPointList pointlist(positions);
    
    const float voxelSize(1.0);
    openvdb::math::Transform::Ptr transform(openvdb::math::Transform::createLinearTransform(voxelSize));
    
    openvdb::tools::PointIndexGrid::Ptr vdbgrid =
        openvdb::tools::createPointIndexGrid<openvdb::tools::PointIndexGrid>(pointlist, *transform);
    
    openvdb::FloatGrid vdbgrid;
    
    
    openvdb::util::NullInterrupter n;
    std::vector<float> distances;
    
    
    openvdb::tools::ClosestSurfacePoint<openvdb::tools::PointIndexGrid> csp;
    
    csp.initialize(*vdbgrid, 0.0f, &n);
    

    最后一行
    csp.initialize(*vdbgrid, 0.0f, &n);
    

    导致调试断言失败。
    File: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\vector
    Line: 72
    
    Expression: vector iterator not dereferencable
    

    我不知道该如何处理。

    因为我无法修改openvdb的内部。我只是打电话给函数,它使错误:(

    如果您对此有任何想法,请帮助。

    再次,问题是..

    如何使用openvdb查找最近的点?

    如果ClosestSurfacePoint是正确的方法,该如何使用?

    非常感谢您。

    最佳答案

    来自OpenVDB的回答指向开发人员。

    这是一个很好的问题,
    我将尝试回答这个问题。

    简而言之,是和否。
    OpenVDB Points是一种理想的基础数据结构,用于进行最近邻居搜索,因为它已经在空间上进行了组织,

    但是,我们尚未为您提供任何高级API来执行此操作,因此您必须自己编写很多算法。

    由于网格的空间性质,
    在您有一个“最大半径”的情况下进行最近邻搜索相对简单且非常快速,因为该搜索不会太大,因为您可以调整体素的大小以匹配该半径并最大化性能。

    执行任意距离的最近邻居搜索更具挑战性,我建议您在不编写支持框架(例如kd-tree)的情况下很难从数据结构中获得不错的性能。

    不过,我们尝试了最近邻居算法,
    因此,如果我没有为您提供该摘要,我们很乐意在此处为您提供有关实现的正确方向。 :)

    谢谢,

    07-24 14:09