# subdivision3d: generic subdivision surface method In rgl: 3D Visualization Using OpenGL

## Description

The subdivision surface algorithm divides and refines (deforms) a given mesh recursively to certain degree (depth). The mesh3d algorithm consists of two stages: divide and deform. The divide step generates for each triangle or quad four new triangles or quads, the deform step drags the points (refinement step).

## Usage

 ```1 2 3 4 5 6``` ``` subdivision3d( x, ...) ## S3 method for class 'mesh3d' subdivision3d( x, depth = 1, normalize = FALSE, deform = TRUE, ... ) divide.mesh3d(mesh, vb = mesh\$vb, ib = mesh\$ib, it = mesh\$it ) normalize.mesh3d(mesh) deform.mesh3d(mesh, vb = mesh\$vb, ib = mesh\$ib, it = mesh\$it ) ```

## Arguments

 `x` 3d geometry mesh `mesh` 3d geometry mesh `depth` recursion depth `normalize` normalize mesh3d coordinates after division if `deform` is `TRUE` `deform` deform mesh `it` indices for triangular faces `ib` indices for quad faces `vb` matrix of vertices: 4xn matrix (rows x, y, z, h) or equivalent vector, where h indicates scaling of each plotted quad `...` other arguments (unused)

## Details

`subdivision3d` takes a mesh object and replaces each triangle or quad with 4 new ones by adding vertices half-way along the edges (and one in the centre of a quad). The positions of the vertices are deformed so that the resulting surface is smoother than the original. These operations are repeated `depth` times.

The other functions do the individual steps of the subdivision. `divide.mesh3d` adds the extra vertices. `deform.mesh3d` does the smoothing by replacing each vertex with the average of each of its neighbours. `normalize.mesh3d` normalizes the homogeneous coordinates, by setting the 4th coordinate to 1. (The 4th coordinate is used as a weight in the deform step.)

`r3d` `mesh3d`
 ```1 2``` ``` open3d() shade3d( subdivision3d( cube3d(), depth = 3 ), color = "red", alpha = 0.5 ) ```