# Skeletonize a complex {sf} object and set return_skeleton_polygons = TRUE in
# generate_beveled_polygon(). This returns skeleton object with polygons included, which
# allows for quickly generating 3D models with different bevels.
if(run_docs_raybevel()) {
library(rayrender)
library(rayvertex)
us_states = spData::us_states
cali = us_states[us_states$NAME == "California",]
cali_skeleton = skeletonize(cali)
plot_skeleton(cali_skeleton)
# We add manual offsets to ensure that the polygon can be morphed all along its interior
bevel = generate_bevel(manual_offsets = seq(0,1,by=0.01), max_height=0.5)
bevel_model_cali = generate_beveled_polygon(cali_skeleton,
bevel_offsets = bevel,
return_skeleton_polygons = TRUE)
bevel_new = change_polygon_bevel(bevel_model_cali,
bevel_offsets = generate_bevel(max_height=0.5,
bevel_end=0.5)) |>
center_mesh()
scene_base = xz_rect(xwidth=100,zwidth=100,
material=diffuse(color="grey20", checkercolor="white")) |>
add_object(sphere(y=8,z=10,x=-3,material=light(intensity=100))) |>
add_object(sphere(y=800,z=10,x=-3,radius=100,material=light(intensity=5)))
raymesh_model(bevel_new, y=0.5, override_material = TRUE,
material = diffuse(color="purple")) |>
add_object(scene_base) |>
render_scene(lookfrom=c(0,30,-10), samples=16,
width=800,height=800,fov=0,ortho_dimensions=c(12,12))
}
# Change to a smooth bevel
if(run_docs_raybevel()) {
new_bevel = generate_bevel("circular", bevel_start = 0, bevel_end=1)
bevel_new = change_polygon_bevel(bevel_model_cali,
bevel_offsets = new_bevel, solid ) |>
center_mesh()
raymesh_model(bevel_new, override_material = TRUE, y=1,material = diffuse(color="purple")) |>
add_object(scene_base) |>
render_scene(lookfrom=c(0,30,-10), samples=16,
width=800,height=800,fov=0,ortho_dimensions=c(12,12))
}
# Make a complex bevel
if(run_docs_raybevel()) {
complex_coords = generate_complex_bevel(
bevel_type = c("angled","flat", "angled", "flat"),
bevel_start = head(seq(0,1,by=0.05),-1),
bevel_end = tail(seq(0,1,by=0.05),-1),
overall_height = 1,
angle = c(45,45,15,15),
reverse = c(FALSE, FALSE,TRUE,TRUE),
plot_bevel = TRUE
)
bevel_new = change_polygon_bevel(bevel_model_cali,
bevel_offsets = complex_coords) |>
center_mesh()
raymesh_model(bevel_new, override_material = TRUE, y=1,material = diffuse(color="purple")) |>
add_object(scene_base) |>
render_scene(lookfrom=c(0,30,-20), samples=16,
width=800,height=800,fov=0,ortho_dimensions=c(12,12))
}
# Quickly generate new bevels to inflate California like a balloon using the arctan function.
if(run_docs_raybevel()) {
inflate_california = function(magnitudes) {
for(val in magnitudes) {
bevel_new = change_polygon_bevel(bevel_model_cali,
bevel_heights = 1/2*atan(seq(0,val,length.out=100)),
bevel_offsets = seq(0,1, length.out=100),
base = TRUE) |>
translate_mesh(c(-120.49,0,-38.72))
raymesh_model(bevel_new, y = 0, override_material = TRUE,
material = glossy(color="darkred")) |>
add_object(scene_base) |>
add_object(sphere(x=-30,z=30,y=18,radius=30,material=light(color="white", intensity=5))) |>
render_scene(lookfrom=c(-1, 28, -20.32), lookat=c(-1, 1.46, -2),
samples=16, width=800, height=800, fov=20)
}
}
inflate_california(c(1,4,16,64))
}
Run the code above in your browser using DataLab