Search code examples
algorithmlanguage-agnostic3dvoxels

How to quickly count the number of neighboring voxels?


I have got a 3D grid (voxels), where some of the voxels are filled, and some are not. The 3D grid is sparsely filled, so I have got a set filledVoxels with coordinates (x, y, z) of the filled voxels. What I am trying to do is find out is for each filled voxel, how many neighboring voxels are filled too.

Here is an example:

  • filledVoxels contains the voxels (1, 1, 1), (1, 2, 1), and (1, 3, 1).
  • Therefore, the neighbor counts are:
    • (1,1,1) has 1 neighbor
    • (1,2,1) has 2 neighbors
    • (1,3,1) has 1 neighbor.

Right now I have this algorithm:

voxelCount = new Map<Voxel, Integer>();

for (voxel v in filledVoxels)
  count = checkAllNeighbors(v, filledVoxels);
  voxelCount[v] = count;
end

checkAllNeighbors() looks up all 26 surrounding voxels. So in total I am doing 26*filledVoxels.size() lookups, which is quite slow.

Is there any way to cut down the number of required lookups? When you look at the above example you can see that I am checking the same voxels several times, so it might be possible to get rid of lookups with some clever caching.

If this helps in any way, the voxels represent a voxelized 3D surface (but there might be holes in it). I usually want to get a list of all voxels that have 5 or 6 neighbors.


Solution

  • You can transform your voxel space into a octree in which every node contains a flag that specifies whether it contains filled voxels at all.

    When a node does not contain filled voxels, you don't need to check any of its descendants.