A level 3 menger sponge in R

Level 3 menger sponge in {rgl}

library(rgl)


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# The base cube
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sl  <- shapelist3d(cube3d(alpha = 1, color = 'grey90', specular = 'black', lit = TRUE), plot = FALSE)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#' Given a shapelist, calculate the next level of the sponge
#' @param sl shapelist3d() object
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
create_next_level <- function(sl, level) {

  scale <- 1/2
  sla <- scale3d(sl, scale, scale, scale)

  x <- 1.5^(level-1)
  shapelist3d(
    list(
      translate3d(sla, -x, -x, -x),
      translate3d(sla,  0, -x, -x),
      translate3d(sla,  x, -x, -x),

      translate3d(sla, -x,  0, -x),
      translate3d(sla,  x,  0, -x),

      translate3d(sla, -x,  x, -x),
      translate3d(sla,  0,  x, -x),
      translate3d(sla,  x,  x, -x),

      translate3d(sla, -x, -x,  0),
      translate3d(sla,  x, -x,  0),

      translate3d(sla, -x,  x,  0),
      translate3d(sla,  x,  x,  0),

      translate3d(sla, -x, -x,  x),
      translate3d(sla,  0, -x,  x),
      translate3d(sla,  x, -x,  x),

      translate3d(sla, -x,  0,  x),
      translate3d(sla,  x,  0,  x),

      translate3d(sla, -x,  x,  x),
      translate3d(sla,  0,  x,  x),
      translate3d(sla,  x,  x,  x)
    ),
    plot = FALSE
  )
}

rgl::clear3d()
sl <- create_next_level(sl, level = 1)
sl <- create_next_level(sl, level = 2)
sl <- create_next_level(sl, level = 3)

shade3d(sl)