首先,如何使用 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)
- 创建点(或加载点)并转换为 vec3d 格式
- 制作点索引网格。
- 设置查询点(ijk)
- 设置索引网格的访问器
- 点采样器()的函数调用
但是,这些示例显示 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
是正确的方法,如何使用它?
我真的很感谢你提前。