gpt4 book ai didi

c++ - 如何使用 OpenVDB 进行最近点查询?

转载 作者:行者123 更新时间:2023-11-30 05:20:27 26 4
gpt4 key购买 nike

首先,如何使用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

但由于 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 树)的情况下很难从数据结构中获得不错的性能.

虽然我们已经尝试过最近邻算法,因此,如果我的总结没有打扰您,我们很乐意在这里为您指明有关实现的正确方向。 :)

谢谢,丹


关于c++ - 如何使用 OpenVDB 进行最近点查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40650434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com