Во-первых, как найти ближайшую точку, используя 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)
Но эти примеры показывают 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
правильный способ сделать это, как его использовать?
Я действительно ценю тебя заранее.
Ответ от OpenVDB указывает разработчик.
Это хороший вопрос,
Я попытаюсь ответить на это.
Короче да и нет.
OpenVDB Points — идеальная базовая структура данных для поиска ближайших соседей, поскольку она уже организована пространственно,
однако мы еще не предоставили для этого высокоуровневых API-интерфейсов, поэтому вам придется самостоятельно писать большую часть алгоритма.
Из-за пространственной природы сетки,
Относительно просто и очень быстро выполнить поиск ближайшего соседа, где у вас есть «максимальный радиус» для поиска, который не слишком велик, так как вы можете настроить размер ваших вокселей для соответствия этому радиусу и максимизировать производительность.
Гораздо сложнее выполнить поиск ближайшего соседа на произвольной дистанции, и я полагаю, что вам будет трудно добиться достойной производительности из структуры данных без написания вспомогательной структуры (такой как kd-дерево).
Мы попытались алгоритмы ближайшего соседа, хотя,
поэтому, если я не откладываю вас в этом резюме, мы будем рады указать вам правильное направление в отношении реализации. 🙂
Спасибо,
Дэн
Других решений пока нет …