Adds 3D contours to the current scene, using the heightmap of the 3D surface.

render_contours(
  heightmap = NULL,
  zscale = 1,
  levels = NA,
  nlevels = NA,
  linewidth = 3,
  color = "black",
  palette = NULL,
  antialias = FALSE,
  offset = 0,
  clear_previous = FALSE
)

Arguments

heightmap

A two-dimensional matrix, where each entry in the matrix is the elevation at that point. All grid points are assumed to be evenly spaced.

zscale

Default 1. The ratio between the x and y spacing (which are assumed to be equal) and the z axis. For example, if the elevation levels are in units of 1 meter and the grid values are separated by 10 meters, zscale would be 10.

levels

Default NA. Automatically generated with 10 levels. This argument specifies the exact height levels of each contour.

nlevels

Default NA. Controls the auto-generation of levels. If levels is length-2, this will automatically generate nlevels breaks between levels[1] and levels[2].

linewidth

Default 3. The line width.

color

Default black. Color of the line.

palette

Default NULL. Overrides color. Either a function that returns a color palette of n colors, or a character vector with colors that specifies each color manually.

antialias

Default FALSE. If TRUE, the line with be have anti-aliasing applied. NOTE: anti-aliasing can cause some unpredictable behavior with transparent surfaces.

offset

Default 5. Offset of the track from the surface, if altitude = NULL.

clear_previous

Default FALSE. If TRUE, it will clear all existing paths.

Examples

#Add contours to the montereybay dataset
if(run_documentation()) {
montereybay %>%
 height_shade() %>%
 add_shadow(ray_shade(montereybay,zscale=50),0.3) %>%
 plot_3d(montereybay, theta = -45, zscale=50)
render_contours(montereybay, zscale = 50, offset = 100)
render_snapshot()
}
#> Error in if (!all(temp_verts[j + 1, ] == temp_verts[j, ])) {    line_scene[[line_counter]] = rayvertex::segment_mesh(start = temp_verts[j,         ] - bbox_center, end = temp_verts[j + 1, ] - bbox_center,         radius = temp_lwd, material = line_mat)    line_counter = line_counter + 1}: missing value where TRUE/FALSE needed

if(run_documentation()) {
#Specify the number of levels
render_contours(montereybay, zscale = 50, offset = 100, nlevels = 30,
               clear_previous = TRUE)
render_snapshot()
}
#> Error in if (!all(temp_verts[j + 1, ] == temp_verts[j, ])) {    line_scene[[line_counter]] = rayvertex::segment_mesh(start = temp_verts[j,         ] - bbox_center, end = temp_verts[j + 1, ] - bbox_center,         radius = temp_lwd, material = line_mat)    line_counter = line_counter + 1}: missing value where TRUE/FALSE needed

if(run_documentation()) {
#Manually specify the breaks with levels
render_contours(montereybay, linewidth = 2,  offset = 100, zscale = 50,
               levels = seq(-2000, 0, 100), clear_previous = TRUE)
render_snapshot()
}
#> Error in if (!all(temp_verts[j + 1, ] == temp_verts[j, ])) {    line_scene[[line_counter]] = rayvertex::segment_mesh(start = temp_verts[j,         ] - bbox_center, end = temp_verts[j + 1, ] - bbox_center,         radius = temp_lwd, material = line_mat)    line_counter = line_counter + 1}: missing value where TRUE/FALSE needed

if(run_documentation()) {
#Use a color palette for the contours 
volcano |> 
 constant_shade() |> 
 plot_3d(volcano, zscale = 2, solid = FALSE, zoom = 0.8)
palette = grDevices::colorRampPalette(c("red", "purple", "pink"))
render_contours(volcano, offset = 1, palette = palette, zscale = 2, nlevels = 20)
render_snapshot()
}
#> Error in if (!all(temp_verts[j + 1, ] == temp_verts[j, ])) {    line_scene[[line_counter]] = rayvertex::segment_mesh(start = temp_verts[j,         ] - bbox_center, end = temp_verts[j + 1, ] - bbox_center,         radius = temp_lwd, material = line_mat)    line_counter = line_counter + 1}: missing value where TRUE/FALSE needed

if(run_documentation()) {
#Render using `render_highquality()` for a neon light effect
render_highquality(light = FALSE, 
                  line_radius = 0.1, sample_method="sobol_blue",
                  path_material = rayrender::light, ground_size = 0,
                  path_material_args = list(importance_sample = FALSE,
                                            color = "purple", intensity = 2))
}