如Ken Museth的文章中所述,我想使用 OpenVDB 重新创建 Enright 测试结果。
设置 OpenVDB 后,我创建了与 OpenVDB 测试git中描述的方式类似的球体。
我收到的结果与文章中显示的结果大不相同。
我的代码如下所示:
openvdb::GridCPtrVec SphereTest(){
openvdb::GridCPtrVec GridVec;
float fGridSize = 512;
int iGridSize = 512;
double w = 1;
openvdb::Vec3f centerEnright(0.35*fGridSize, 0.35*fGridSize, 0.35*fGridSize);
openvdb::FloatGrid::Ptr grid(new openvdb::FloatGrid());
grid->setGridClass(openvdb::GridClass::GRID_LEVEL_SET);
auto tree = grid->treePtr();
auto outside = 5 * w;
auto inside = -outside;
for (int i = 0; i < iGridSize; ++i)
{
for (int j = 0; j < iGridSize; j++)
{
for (int k = 0; k < iGridSize; k++)
{
openvdb::Coord coord(i, j, k);
const openvdb::Vec3f p = grid->transform().indexToWorld(coord);
const float dist = float((p - centerEnright).length() - (0.15*fGridSize));
auto aDist = abs(dist);
if (aDist < outside)
{
if (dist>0)
tree->setValue(coord, dist);
else
tree->setValue(coord, dist);
}
else
{
if (dist>outside)
tree->setValueOff(coord, outside);
else
tree->setValueOff(coord, inside);
}
}
}
}
std::cout << "Active Voxels MV: " << grid->activeVoxelCount() / 1000000.0 << "\n";
double mem = MemInfo::virtualMemUsedByMe();
std::cout << "Memory MB: " << mem / 1000000.0 << "\n";
openvdb::tools::pruneLevelSet(grid->tree());
std::cout << "Active Voxels MV: " << grid->activeVoxelCount() / 1000000.0 << "\n";
double lastmem=mem;
mem = MemInfo::virtualMemUsedByMe();
std::cout << "Memory MB: " << (mem-lastmem) / 1000000.0 << "\n";
GridVec.push_back(grid);}
我的结果如下:
活动体素 MV:0.742089
内存 MB:617.325
后
活动体素 MV:0.742089
内存 MB:56.234
正如我们所看到的,它比文章中的结果大十倍。
结果可以在文章中的表 II、III 和 IV 中看到,参考 512^3 网格大小,具有 [6,5,4,3] 树分支。我已经达到了几乎相同数量的活动体素(表 III),但有显着的额外内存消耗表(IV),而表 II 的结果非常混乱。我错过了什么吗?或者做错了什么,可能没有像文章所述那样激活某种压缩或位量化。
同样,当使用查看器查看生成的网格时,它会显示一个完美的圆形球体(不是以布尔方式体素化),这就是我想要的。
有什么想法吗?
谢谢你