Как сделать запрос ближайшей точки с помощью OpenVDB?

Во-первых, как найти ближайшую точку, используя openvdb?

Во-вторых, если ClosestSurfacePoint правильный способ сделать это, как его использовать?

Я читаю статью о ICP, используя OpenVDB для более быстрой NNS.

(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)

  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 правильный способ сделать это, как его использовать?

Я действительно ценю тебя заранее.

1

Решение

Ответ от OpenVDB указывает разработчик.


Это хороший вопрос,
Я попытаюсь ответить на это.

Короче да и нет.
OpenVDB Points — идеальная базовая структура данных для поиска ближайших соседей, поскольку она уже организована пространственно,

однако мы еще не предоставили для этого высокоуровневых API-интерфейсов, поэтому вам придется самостоятельно писать большую часть алгоритма.

Из-за пространственной природы сетки,
Относительно просто и очень быстро выполнить поиск ближайшего соседа, где у вас есть «максимальный радиус» для поиска, который не слишком велик, так как вы можете настроить размер ваших вокселей для соответствия этому радиусу и максимизировать производительность.

Гораздо сложнее выполнить поиск ближайшего соседа на произвольной дистанции, и я полагаю, что вам будет трудно добиться достойной производительности из структуры данных без написания вспомогательной структуры (такой как kd-дерево).

Мы попытались алгоритмы ближайшего соседа, хотя,
поэтому, если я не откладываю вас в этом резюме, мы будем рады указать вам правильное направление в отношении реализации. 🙂

Спасибо,
Дэн


1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]