まず、openvdb を使用して最も近いポイントを見つける方法は?
第二に、それClosestSurfacePoint
を行う正しい方法がある場合、それをどのように使用するのですか?
NNS を高速化するために OpenVDB を使用した ICP に関する論文を読みました。
( http://www.pmavridis.com/research/effective_sparse_icp/ )
著者は、NNS に openvdb を使用することで速度が向上したと述べています。
そして、他の何人かの人々が同様の方法で同じことを達成しました。
だから、私はそれを自分で試してみたかったのです。
試行錯誤の末、ようやくコンパイルに成功。
しかし、私は少し混乱しています。
私の見解では(オンラインクックブックを含む多くのドキュメントを読んだ後)、サンプラーはそれを行うように見えました
だから、私はこれらの例を試しました。
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)
- インデックス グリッドのアクセサを設定
- point sampler() の関数呼び出し
ただし、これらの例は 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);
原因 Debug Assertion が失敗しました。
File: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\vector
Line: 72
Expression: vector iterator not dereferencable
これらのことにどう対処したらよいかわかりません。
openvdb の内部を変更できないためです。関数を呼び出したところ、エラーが発生します:(
これについて何か考えがある場合は、助けてください。
繰り返しますが、質問は..
openvdbを使用して最も近い点を見つける方法は?
ClosestSurfacePoint
それを行う正しい方法である場合、それをどのように使用しますか?
よろしくお願いします。