Render a 3D scene with meshes, lights, and lines using a software rasterizer.
rasterize_scene(
scene,
filename = NA,
width = 800,
height = 800,
line_info = NULL,
alpha_line = 1,
parallel = TRUE,
plot = is.na(filename),
fov = 20,
lookfrom = c(0, 0, 10),
lookat = NULL,
camera_up = c(0, 1, 0),
fsaa = 2,
light_info = directional_light(),
color = "red",
type = "diffuse",
background = "black",
tangent_space_normals = TRUE,
shadow_map = TRUE,
shadow_map_bias = 0.003,
shadow_map_intensity = 0,
shadow_map_dims = NULL,
ssao = FALSE,
ssao_intensity = 10,
ssao_radius = 0.1,
tonemap = "none",
debug = "none",
near_plane = 0.1,
far_plane = 100,
shader = "default",
block_size = 4,
shape = NULL,
line_offset = 1e-05,
ortho_dimensions = c(1, 1),
bloom = FALSE,
antialias_lines = TRUE,
environment_map = "",
background_sharpness = 1,
verbose = FALSE,
vertex_transform = NULL,
validate_scene = TRUE,
transparent_background = FALSE
)The scene object.
Default NULL. Filename to save the image. If NULL, the image will be plotted.
Default 400. Width of the rendered image.
Default 400. Width of the rendered image.
Default NULL. Matrix of line segments to add to the scene. Number of rows must be a multiple of 2.
Default 1. Line transparency.
Default TRUE. Whether to use parallel processing.
Default is.na(filename). Whether to plot the image.
Default 20. Width of the rendered image.
Default c(0,0,10). Camera location.
Default NULL. Camera focal position, defaults to the center of the model.
Default c(0,1,0). Camera up vector.
Default 2. Full screen anti-aliasing multiplier. Must be positive integer, higher numbers
will improve anti-aliasing quality but will vastly increase memory usage.
Default directional_light(). Description of scene lights, generated with the point_light() and
directional_light() functions.
Default darkred. Color of model if no material file present (or for faces using the default material).
Default diffuse. Shader type. Other options: vertex (Gouraud shading), phong, and color (no lighting).
Default white. Background color.
Default TRUE.
Default FALSE.
Default 0.005.
Default 0.5.
Default NULL.
Default FALSE. Whether to add screen-space ambient occlusion (SSAO) to the render.
Default 10. Intensity of the shadow map.
Default 0.1. Radius to use when calculating the SSAO term.
Default "none".
Default "none".
Default 0.1.
Default 100.
Default "default".
Default 4.
Default NULL. The shape to render in the OBJ mesh.
Default 0.0001. Amount to offset lines towards camera to prevent z-fighting.
Default c(1,1). Width and height of the orthographic camera. Will only be used if fov = 0.
Default FALSE. Whether to apply bloom to the image. If TRUE,
this performs a convolution of the HDR image of the scene with a sharp, long-tailed
exponential kernel, which does not visibly affect dimly pixels, but does result in emitters light
slightly bleeding into adjacent pixels.
Default TRUE. Whether to anti-alias lines in the scene.
Default "". Image file to use as a texture for all reflective and refractive
materials in the scene, along with the background.
Default 1.0. A number greater than zero but less than one indicating the sharpness
of the background image.
Default FALSE. Prints out timing information.
Default NULL. A function that transforms the vertex locations, based on their location.
Function should takes a length-3 numeric vector and returns another length-3 numeric vector as the output.
Default TRUE. Whether to validate the scene input.
Default FALSE. Whether the background of the render should be transparent.
Rasterized image.
if(run_documentation()) {
#Let's load the cube OBJ file included with the package
rasterize_scene(cube_mesh(),lookfrom=c(2,4,10),
light_info = directional_light(direction=c(0.5,1,0.7)))
}
#> Setting `lookat` to: c(0.00, 0.00, 0.00)
if(run_documentation()) {
#Flatten the cube, translate downwards, and set to grey
base_model = cube_mesh() |>
scale_mesh(scale=c(5,0.2,5)) |>
translate_mesh(c(0,-0.1,0)) |>
set_material(diffuse="grey80")
rasterize_scene(base_model, lookfrom=c(2,4,10),
light_info = directional_light(direction=c(0.5,1,0.7)))
}
#> Setting `lookat` to: c(0.00, -0.10, 0.00)
if(run_documentation()) {
#load the R OBJ file, scale it down, color it blue, and add it to the grey base
r_model = obj_mesh(r_obj(simple_r = TRUE)) |>
scale_mesh(scale=0.5) |>
set_material(diffuse="dodgerblue") |>
add_shape(base_model)
rasterize_scene(r_model, lookfrom=c(2,4,10),
light_info = directional_light(direction=c(0.5,1,0.7)))
}
#> Setting `lookat` to: c(0.00, 0.34, 0.00)
if(run_documentation()) {
#Zoom in and reduce the shadow mapping intensity
rasterize_scene(r_model, lookfrom=c(2,4,10), fov=10,shadow_map = TRUE, shadow_map_intensity=0.3,
light_info = directional_light(direction=c(0.5,1,0.7)))
}
#> Setting `lookat` to: c(0.00, 0.34, 0.00)
if(run_documentation()) {
#Include the resolution (4x) of the shadow map for less pixellation around the edges
#Also decrease the shadow_map_bias slightly to remove the "peter panning" floating shadow effect
rasterize_scene(r_model, lookfrom=c(2,4,10), fov=10,
shadow_map_dims=4,
light_info = directional_light(direction=c(0.5,1,0.7)))
}
#> Setting `lookat` to: c(0.00, 0.34, 0.00)
if(run_documentation()) {
#Add some more directional lights and change their color
lights = directional_light(c(0.7,1.1,-0.9),color = "orange",intensity = 1) |>
add_light(directional_light(c(0.7,1,1),color = "dodgerblue",intensity = 1)) |>
add_light(directional_light(c(2,4,10),color = "white",intensity = 0.5))
rasterize_scene(r_model, lookfrom=c(2,4,10), fov=10,
light_info = lights)
}
#> Setting `lookat` to: c(0.00, 0.34, 0.00)
if(run_documentation()) {
#Add some point lights
lights_p = lights |>
add_light(point_light(position=c(-1,1,0),color="red", intensity=2)) |>
add_light(point_light(position=c(1,1,0),color="purple", intensity=2))
rasterize_scene(r_model, lookfrom=c(2,4,10), fov=10,
light_info = lights_p)
}
#> Setting `lookat` to: c(0.00, 0.34, 0.00)
if(run_documentation()) {
#change the camera position
rasterize_scene(r_model, lookfrom=c(-2,2,-10), fov=10,
light_info = lights_p)
}
#> Setting `lookat` to: c(0.00, 0.34, 0.00)
if(run_documentation()) {
#Add a spiral of lines around the model by generating a matrix of line segments
t = seq(0,8*pi,length.out=361)
line_mat = matrix(nrow=0,ncol=9)
for(i in 1:360) {
line_mat = add_lines(line_mat,
generate_line(start = c(0.5*sin(t[i]), t[i]/(8*pi), 0.5*cos(t[i])),
end = c(0.5*sin(t[i+1]), t[i+1]/(8*pi), 0.5*cos(t[i+1]))))
}
rasterize_scene(r_model, lookfrom=c(2,4,10), fov=10, line_info = line_mat,
light_info = lights)
}
#> Setting `lookat` to: c(0.00, 0.34, 0.00)