使用OpenVDB重建Enright测试

时间:2018-05-22 12:01:46

标签: c++ graphics voxel openvdb

我想用Ken Museth在article中提到的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);}

我的结果如下:

Active Voxels MV:0.742089

记忆MB:617.325

Active Voxels MV:0.742089

记忆MB:56.234

并且从文章中的结果可以看出它十倍大

结果可以参见文章表II,III和IV,参考512 ^ 3网格,[6,5,4,3]树枝。我已达到几乎相同数量的活动体素(表III),但具有显着的额外内存消耗表(IV),而表II的结果非常混乱。我错过了什么吗?或者做错了什么,也许不会激活某种压缩或比特量化,如文章所述。

当使用观察者查看生成的网格时,它会显示一个完美的圆形球体(不是以布尔方式进行体素化),这就是我想要的。

有什么想法吗?

谢谢

0 个答案:

没有答案