首先,如何使用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)
点采样器的
但是,这些示例显示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)的情况下很难从数据结构中获得不错的性能。
不过,我们尝试了最近邻居算法,
因此,如果我没有为您提供该摘要,我们很乐意在此处为您提供有关实现的正确方向。 :)
谢谢,
担