1

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

其次,如果ClosestSurfacePoint是正确的方法,如何使用它?

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

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

作者说他通过使用openvdb for 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)

  1. 创建点(或加载点)并转换为 vec3d 格式
  2. 制作点索引网格。
  3. 设置查询点(ijk)
  4. 设置索引网格的访问器
  5. 点采样器()的函数调用

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

如果找到完全相同的位置,则返回 1。如果没有,则返回 0。

可能,这个点采样器不是我要找的。

换个方式试试。

其他候选人是

 ClosestSurfacePoint, ClosestPointProjector.

我尝试了下面写的代码,它类似于 betajippity 的工作 https://github.com/betajippity/Ariel/blob/master/src/grid/levelset.cpp

但由于矢量而出错

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是正确的方法,如何使用它?

我真的很感谢你提前。

4

1 回答 1

1

来自 OpenVDB 积分开发者的回答。


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

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

但是,我们还没有为您提供任何高级 API 来执行此操作,因此您必须自己编写大部分算法。

由于网格的空间特性,进行最近邻搜索相对简单且非常快速,您可以在其中搜索的“最大半径”不是太大,因为您可以调整体素的大小以匹配这个半径并最大限度地提高性能。

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

不过,我们已经尝试过最近邻算法,所以如果我没有让你对那个总结感到厌烦,我们很乐意在这里为你指出关于实现的正确方向。:)

谢谢,丹


于 2016-11-26T03:52:43.573 回答