Applies a planar UV mapping to a mesh based on a given direction and set of U/V vectors.
If full_mesh_bbox
is true, the UV mapping is scaled based on the bounding box
of the entire mesh. If false, each shape's bounding box is used.
One of direction/u/v must be NULL
and will be calculated from the others.
add_plane_uv_mesh(
mesh,
direction = c(0, 1, 0),
u = NULL,
v = NULL,
override_existing = FALSE,
full_mesh_bbox = TRUE
)
The mesh to which the UV mapping will be applied.
Default c(0, 1, 0)
. A vector specifying the direction for
UV mapping. If not specified and u
/v
are both specified, this will be ignored.
Default NULL
. A vector specifying the u direction.
Default NULL
. A vector specifying the v direction.
Default FALSE
. Specifies whether existing UV
coordinates should be overridden.
Default TRUE
. Specifies whether the full mesh's
bounding box is used for UV mapping.
Modified mesh with added UV mapping.
if(run_documentation()) {
#Let's construct a mesh from the volcano dataset
#Build the vertex matrix
vertex_list = list()
counter = 1
for(i in 1:nrow(volcano)) {
for(j in 1:ncol(volcano)) {
vertex_list[[counter]] = matrix(c(j,volcano[i,j]/3,i), ncol=3)
counter = counter + 1
}
}
vertices = do.call(rbind,vertex_list)
#Build the index matrix
index_list = list()
counter = 0
for(i in 1:(nrow(volcano)-1)) {
for(j in 1:(ncol(volcano)-1)) {
index_list[[counter+1]] = matrix(c(counter,counter+ncol(volcano),counter+1,
counter+ncol(volcano),counter+ncol(volcano)+1,counter + 1),
nrow=2, ncol=3, byrow=TRUE)
counter = counter + 1
}
counter = counter + 1
}
indices = do.call("rbind",index_list)
#Create a checkerboard image
create_checkerboard_texture = function(filename, n = 16) {
old_par = par(no.readonly = TRUE)
on.exit(par(old_par))
plot.new()
par(mar = c(0, 0, 0, 0))
checkerboard = matrix(c(1, 0), nrow = n+1, ncol = n)
png(filename, width = 800, height = 800)
image(1:(n+1), 1:n, checkerboard, col = c("dodgerblue", "red"),
axes = FALSE, xlab = "", ylab = "")
dev.off()
}
checkerboard_file = tempfile(fileext = ".png")
create_checkerboard_texture(checkerboard_file)
rayimage::plot_image(checkerboard_file)
}
if(run_documentation()) {
#Construct the mesh
volc_mesh = construct_mesh(vertices = vertices, indices = indices,
material = material_list(type="phong", diffuse="darkred",
ambient = "darkred", ambient_intensity=0.2))
#Set the direction so that the checkerboard will be mapped to the surface like a carpet
uv = add_plane_uv_mesh(volc_mesh, direction=c(0,200,0), u = c(1,0,0))
uv = set_material(uv, texture_location = checkerboard_file,
ambient = "white", ambient_intensity=0.1)
#Rasterize the scene
rasterize_scene(center_mesh(uv), lookfrom=c(200,200,200),fov=0,width=1200,height=1200,
light_info = directional_light(c(0,1,1)) |>
add_light(directional_light(c(1,1,-1))),ortho_dimensions=c(120,120))
}
#> Setting `lookat` to: c(0.00, 0.00, 0.00)
if(run_documentation()) {
#Set the direction so that the checkerboard will be mapped directly at the camera
uv = add_plane_uv_mesh(volc_mesh, direction=c(200,200,200), v = c(-1,1,-1))
uv = set_material(uv, texture_location = checkerboard_file,
ambient = "white", ambient_intensity=0.1)
#Rasterize the scene
rasterize_scene(center_mesh(uv), lookfrom=c(200,200,200),fov=0,width=1200,height=1200,
light_info = directional_light(c(0,1,1)) |>
add_light(directional_light(c(1,1,-1))), ortho_dimensions=c(120,120))
}
#> Setting `lookat` to: c(0.00, 0.00, 0.00)