OpenVDB кажется действительно удивительным, а адресация узлов очень умной. Есть некоторые операции, которые я не понимаю, в частности операции CSG. Это пример кода. В качестве входных данных он принимает два аргумента:
Алгоритм должен принимать входные данные,
Я пытаюсь использовать сетки VDB в качестве контейнера данных вместо алгоритма классического дерева, для физического моделирования, которое требует высокого уровня детализации при столкновениях.
Я понимаю концепцию преобразования между мировыми координатами и координатами сетки, но я не могу понять, как выполнить преобразование данных внутри дерева, например, перевести или повернуть наборы уровней, как жесткий объект. В этом примере, я думаю, я только меняю трансформацию между миром и решеткой.
Это результат (то же самое для уровня и громкости):Начальная сеткаСформирована сетка, кажется, что вращение выполняется …нет окончательного результата?
Есть ли у вас предложения?
Прилагается: один пример и ссылка на ССЫЛКА УДАЛЕНА что я использую (извините, это 133MB …)
#include <cmath>
#include "openvdb/openvdb.h"#include "openvdb/util/Util.h"#include "openvdb/io/Stream.h"#include "openvdb/tools/Composite.h"
using namespace openvdb;
int main(int argc, char** argv) {
openvdb::initialize();
openvdb::io::File file(argv[1]);
file.open();
GridBase::Ptr baseGrid;
for (openvdb::io::File::NameIterator nameIter = file.beginName();
nameIter != file.endName(); ++nameIter)
{ baseGrid = file.readGrid(nameIter.gridName()); }
file.close();
FloatGrid::Ptr gridA = gridPtrCast<FloatGrid>(baseGrid);
FloatGrid::Ptr gridB = gridA->deepCopy();
FloatGrid::Ptr result = gridA ->deepCopy();
gridB->transform().postRotate(M_PI/4.0f, math::Y_AXIS);
tools::csgUnion(*result, *gridB);
openvdb::io::File file_out(argv[2]);
GridPtrVec grids;
grids.push_back(gridA);
grids.push_back(gridB);
grids.push_back(result);
file_out.write(grids);
file_out.close();
return 0;
}
Решение моего ответа, благодаря поддержке VDB на форуме OpenVDB:
tools::resampleToMatch
, выбрав один из интерполяторов (в моем случае tools::BoxSample
) имеется в наличии.К вашему сведению, есть крайняя разница во время исполнения
используя флаг оптимизации -O3
(Сокращение времени на 400%).
#include "openvdb/io/Stream.h"#include "openvdb/openvdb.h"#include "openvdb/tools/Composite.h"#include "openvdb/tools/GridTransformer.h"#include "openvdb/tools/Interpolation.h"#include "openvdb/util/Util.h"
#include <cmath>
using namespace openvdb;
int main(int argc, char **argv) {
openvdb::initialize();
openvdb::io::File file(argv[1]);
file.open();
GridBase::Ptr baseGrid;
for (openvdb::io::File::NameIterator nameIter = file.beginName();
nameIter != file.endName(); ++nameIter) {
baseGrid = file.readGrid(nameIter.gridName());
}
file.close();
FloatGrid::Ptr gridA = gridPtrCast<FloatGrid>(baseGrid);
FloatGrid::Ptr gridB = gridA->copy(CP_NEW);
gridB->setTransform(gridA->transform().copy());
gridB->transform().postRotate(M_PI / 4.0f, math::Y_AXIS);
tools::resampleToMatch<tools::BoxSampler>(*gridA, *gridB);
FloatGrid::Ptr result = gridA->deepCopy();
FloatGrid::Ptr gridB2 = gridB->deepCopy();
tools::csgUnion(*result, *gridB);
openvdb::io::File file_out(argv[2]);
GridPtrVec grids;
grids.push_back(gridA);
grids.push_back(gridB2);
grids.push_back(result);
file_out.write(grids);
file_out.close();
return 0;
}
Ссылка: Форум OpenVDB
Других решений пока нет …