Voxel

Think the geometric space like a three dimensional grid. Every cell in this grid is called voxel. The whole space can be filled with this small voxel.

If we fill voxels with negative values, then this means that we are inside an object. Other voxels have positive values. A positive stands for the distance from the current voxel to the surface of the object. A zero level set is a surface where the voxels values go from negative values to positive values.

To calculate the geometry of this objects two steps where necessary. First use an statistically dependent noise generator to fill the voxeles with values. statistically dependent mean that voxels in the neighborhood have more likely similar vales but voxel at an greater can differ in a greater amount. Perlin noise or Perlin turbulence can be used for this job.

In a second step a surfaced is build where the values are approximately zero. This iso-surface can be exported as a mesh, suitable for 3d rendering software. Both steps are done in OpenVDB a software for sparse volumetric data.

voxel_size :size 0.005
half_width :width 48

turbulence :r 0.6 :noise_base 1 :noise_scale 0.2 \
           :sx 15.0 :sy 15.0 :sz 15.0 \
           :octave 7 :ampscale 0.9 :freqscale 0.95
mesh :fn 100.95 :adaptivity 0.95

end
voxel_size :size 0.01
half_width :width 96

sphere :r 0.9
noise :noise_shape 1 :noise_base 21 :sx 3.0 :sy 3.0 :sz 3.0
difference
voxel_sample :fn 0 :inner 0.4 :outer 0.8 :steps 10

sphere :r 0.9
noise :noise_shape 1 :noise_base 1 :sx 3.0 :sy 3.0 :sz 3.0
difference
voxel_sample :fn 1 :sampler 1 :tests 100 :inner 0.4 :outer 0.8 :steps 10
mesh :fn 1.02 :adaptivity 0.02

end

Software used

  • OpenVDB to fill narrow-band level sets using noise function.
  • OpenVDB to export the mesh covering the isosurface.
  • Blender to assign material properties to the mesh and illuminate the scene with light sources.
  • Cycles or LuxCoreRender to render the image.