clipMesh: Clip a mesh

View source: R/clip.R

clipMeshR Documentation

Clip a mesh

Description

Clip a mesh to the volume bounded by another mesh.

Usage

clipMesh(mesh, clipper, clipVolume = TRUE, normals = FALSE)

Arguments

mesh

a mesh given either as a list containing (at least) the fields vertices and faces, otherwise a rgl mesh (i.e. a mesh3d object)

clipper

a mesh given either as a list containing (at least) the fields vertices and faces, otherwise a rgl mesh (i.e. a mesh3d object)

clipVolume

Boolean, whether the clipping has to be done on the volume bounded by mesh rather than on its surface (i.e. mesh will be kept closed if it is closed)

normals

Boolean, whether to compute the vertex normals of the output mesh

Value

A triangle mesh represented as the output of the Mesh function.

Note

If clipVolume=TRUE, the mesh to be clipped (mesh) must be without self-intersection.

Examples

# cube clipped to sphere
library(MeshesOperations)
library(rgl)
mesh    <- cube3d()
clipper <- sphereMesh(r= sqrt(2))
clippedMesh <- clipMesh(mesh, clipper)
open3d(windowRect = c(50, 50, 562, 562))
view3d(zoom = 0.9)
shade3d(toRGL(clippedMesh), color = "purple")

# Barth sextic ####
library(MeshesOperations)
library(rgl)
library(rmarchingcubes)
# isosurface function
gold <- (1+sqrt(5))/2
f <- function(x,y,z){
	x2 <- x*x; y2 <- y*y; z2 <- z*z
	4*(gold^2*x2-y2)*(gold^2*y2-z2)*(gold^2*z2-x2) -
			(1+2*gold)*(x2+y2+z2-1)^2
}
# grid
n <- 200L
x <- y <- z <- seq(-sqrt(3), sqrt(3), length.out = n)
g <- expand.grid(X = x, Y = y, Z = z)
# calculate voxel
voxel <- array(with(g, f(X, Y, Z)), dim = c(n, n, n))
# calculate isosurface
contour_shape <- contour3d(
		griddata = voxel, level = 0, x = x, y = y, z = z
)
# make rgl mesh (plotted later)
mesh <- tmesh3d(
		vertices = t(contour_shape[["vertices"]]),
		indices  = t(contour_shape[["triangles"]]),
		normals  = contour_shape[["normals"]],
		homogeneous = FALSE
)
# clip to sphere of radius sqrt(3)
clipper <- sphereMesh(r = sqrt(3))
clippedMesh <- clipMesh(mesh, clipper, clipVolume = FALSE, normals = TRUE)
# plot
open3d(windowRect = c(50, 50, 950, 500))
mfrow3d(1, 2)
view3d(zoom = 0.8)
shade3d(mesh, color = "darkred")
next3d()
view3d(zoom = 0.8)
shade3d(toRGL(clippedMesh), color = "darkred")

stla/MeshesOperations documentation built on Oct. 23, 2022, 8:23 a.m.