Вычисление расстояния от граничного поля, прохождение через вокселей и доступ к их соседям
Я работаю над проектом, который предполагает извлечение центральной линии из закрытого объекта. Я должен сделать следующие шаги обработки перед реализацией алгоритма извлечения центральной линии. Я новичок в openvdb, поэтому нужна помощь.
- Вокселизировать сетку.
- Вычислить расстояние от граничного поля для каждого вокселя.
- Итерировать по вокселям.
- Доступ 26 соседей воксела.
Моя попытка
Шаг 1 и 2 - чтобы выполнить шаг 1 и шаг 2, я делаю следующее. а) Чтение волнового фронта объекта. Я написал специальную функцию для этого, которая заполняет векторы Vec3s, Vec3I и Vec4I. б) передать данные в следующую функцию, чтобы вычислить расстояние от граничного поля.
GridType::Ptr meshToSignedDistanceField ( const openvdb::math::Transform & xform, const std::vector< Vec3s > & points, const std::vector< Vec3I > & triangles, const std::vector< Vec4I > & quads, float exBandWidth, float inBandWidth )
Я использую правильную функцию API для вычисления расстояния от граничного поля? Если это так, я не понимаю 5-й (float exBandWidth) и 6-й (float inBandWdth) аргументы. Некоторые указатели относительно них будут полезны.
Теперь у меня есть расстояние от граничных полей, которые я перебираю по сетке, используя итераторы значений следующим образом
for (openvdb::FloatGrid::ValueAllCIter iter = grid->cbeginValueAll(); iter.test(); ++iter) { float dist = iter.getValue(); if (dist > 0.0) { std::cout << "exterior voxel" << std::endl; } else { std::cout << "interior voxel" << std::endl; } }
Мой первый вопрос: правильно ли я делаю этот шаг? Если так, то я также хочу получить доступ к 26 соседям для каждого вокселя. Как это сделать??