Takes the scene description and renders an image, either to the device or to a filename.

render_scene(scene, width = 400, height = 400, fov = 20,
  samples = 100, ambient_light = FALSE, lookfrom = c(10, 1, 0),
  lookat = c(0, 0, 0), camera_up = c(0, 1, 0), aperture = 0.1,
  clamp_value = Inf, filename = NULL, backgroundhigh = "#80b4ff",
  backgroundlow = "#ffffff", shutteropen = 0, shutterclose = 1,
  focal_distance = NULL, parallel = FALSE)

Arguments

scene

Tibble of object locations and properties.

width

Default `200`. Width of the render, in pixels.

height

Default `200`. Height of the render, in pixels.

fov

Default `20`. Field of view, in degrees.

samples

Default `100`. Number of samples for each pixel.

ambient_light

Default `FALSE`, unless there are no emitting objects in the scene. If `TRUE`, the background will be a gradient varying from `backgroundhigh` directly up (+y) to `backgroundlow` directly down (-y).

lookfrom

Default `c(10,1,0)`. Location of the camera.

lookat

Default `c(0,0,0)`. Location where the camera is pointed.

camera_up

Default `c(0,1,0)`. Vector indicating the "up" position of the camera.

aperture

Default `0.1`. Aperture of the camera. Higher numbers will increase depth of field.

clamp_value

Default `Inf`. If a bright light or a reflective material is in the scene, occasionally there will be bright spots that will not go away even with a large number of samples. These can be removed (at the cost of slightly darkening the image) by setting this to a small number greater than 1.

filename

Default `NULL`. If present, the renderer will write to the filename instead of the current device.

backgroundhigh

Default `#80b4ff`. The "high" color in the background gradient. Can be either a hexadecimal code, or a numeric rgb vector listing three intensities between `0` and `1`.

backgroundlow

Default `#ffffff`. The "low" color in the background gradient. Can be either a hexadecimal code, or a numeric rgb vector listing three intensities between `0` and `1`.

shutteropen

Default `0`. Time at which the shutter is open. Only affects moving objects.

shutterclose

Default `1`. Time at which the shutter is open. Only affects moving objects.

focal_distance

Default `NULL`, automatically set to the `lookfrom-lookat` distance unless otherwise specified.

parallel

Default `FALSE`. If `TRUE`, it will use all available cores to render the image (or the number specified in `options("cores")` if that option is not `NULL`).

Value

Raytraced plot to current device, or an image saved to a file.

Examples

#Generate a large checkered sphere as the ground scene = generate_ground(depth=-0.5,material=lambertian(color="white", checkercolor="darkgreen"))
render_scene(scene,samples=200,parallel=TRUE)
#Add a sphere to the center scene = scene %>% add_object(sphere(x=0,y=0,z=0,radius=0.5,material = lambertian(color=c(1,0,1))))
render_scene(scene,fov=20,parallel=TRUE)
#Add a marbled cube scene = scene %>% add_object(cube(x=0,y=0,z=1.1,material = lambertian(noise=3)))
render_scene(scene,fov=20,parallel=TRUE)
#Add a metallic gold sphere scene = scene %>% add_object(sphere(x=0,y=0,z=-1.1,radius=0.5,material = metal(color="gold",fuzz=0.1)))
render_scene(scene,fov=20,parallel=TRUE)
#Lower the number of samples to render more quickly. render_scene(scene,fov=20, samples=8)
#Add a floating R plot using the iris dataset as a png onto a floating 2D rectangle tempfileplot = tempfile() png(filename=tempfileplot,height=400,width=800) plot(iris$Petal.Length,iris$Sepal.Width,col=iris$Species,pch=18,cex=4) dev.off()
#> pdf #> 2
image_array = png::readPNG(tempfileplot) scene = scene %>% add_object(yz_rect(x=0,y=1.1,z=0,zwidth=2,material = lambertian(image = image_array)))
render_scene(scene,fov=20,parallel=TRUE)
#Move the camera
render_scene(scene,lookfrom = c(7,1.5,10),lookat = c(0,0.5,0),fov=15,parallel=TRUE)
#Change the background gradient to a night time ambience
render_scene(scene,lookfrom = c(7,1.5,10),lookat = c(0,0.5,0),fov=15, backgroundhigh = "#282375", backgroundlow = "#7e77ea",parallel=TRUE)
#Increase the aperture to give more depth of field.
render_scene(scene,lookfrom = c(7,1.5,10),lookat = c(0,0.5,0),fov=15, aperture = 0.5,parallel=TRUE)
#Spin the camera around the scene, decreasing the number of samples to render faster. To make #an animation, specify the a filename in `render_scene` for each frame. t=1:30 xpos = 10 * sin(t*12*pi/180+pi/2) zpos = 10 * cos(t*12*pi/180+pi/2)
par(mfrow=c(5,6)) for(i in 1:30) { render_scene(scene, samples=5, lookfrom = c(xpos[i],1.5,zpos[i]),lookat = c(0,0.5,0),parallel=TRUE) }