View source: R/plot-mesh-dotcloud.R
| plot_mesh_dotcloud | R Documentation |
Projects mesh vertices onto a 2D plane using an orthographic camera defined
by an eye position, a look-at point, and an up direction, then draws the
projected dots with base-R plot. Each dot is
rendered opaque, but its cex is modulated by a rim-light weight
1 - |n \cdot z_{cam}|: front- and back-facing vertices shrink toward
zero size, while grazing-edge vertices keep their full size. This
size-modulated trick gives a rim-light look without paying R's per-point
transparency-blending cost.
Multiple meshes share a single depth space: all vertices are projected
together and sorted globally by depth before a single plot() call,
so the painter's algorithm works correctly across meshes. Meshes without
faces (point clouds) are rendered at full size and are not affected
by the side filter.
plot_mesh_dotcloud(
mesh,
eye = c(0, 0, 1000),
lookat = c(0, 0, 0),
up = c(0, 1, 0),
col = c("white", "gray30"),
pch = 16L,
cex = 0.1,
add = FALSE,
axes = FALSE,
asp = 1,
xlim = NULL,
ylim = NULL,
zoom = 1,
xlab = "",
ylab = "",
normal_weight = c("auto", "area", "angle"),
side = c("front", "back", "both"),
mesh_clipping = 0.7,
alpha = 1,
clipping_plane = NULL,
clipping_plane_enabled = TRUE,
...
)
mesh |
a |
eye |
numeric vector of length 3 - camera position in world space. |
lookat |
numeric vector of length 3 - the world-space point the camera is looking at. |
up |
numeric vector of length 3 - a world-space vector indicating
which direction is "up" for the camera; defaults to |
col |
base color(s) for the dots. Accepted forms:
Default |
pch |
point character; a scalar or vector/list with one value per mesh,
recycled as necessary. Default |
cex |
point expansion factor; a scalar or vector/list with one value
per mesh, recycled as necessary. Default |
add |
logical; if |
axes |
logical; whether to draw axes on a new plot. Ignored when
|
asp |
aspect ratio of the new plot; default |
xlim, ylim |
axis limits for the new plot; |
zoom |
positive numeric magnification applied to the auto-computed
axis limits when |
xlab, ylab |
axis labels for the new plot. Ignored when
|
normal_weight |
passed to |
side |
which side of meshed surfaces to render. One of |
mesh_clipping |
numeric in |
alpha |
numeric in |
clipping_plane |
optional list of world-space clipping planes used to
hide parts of the scene. Each plane is a numeric vector of length 5:
the first three entries are the plane normal |
clipping_plane_enabled |
logical vector, one entry per mesh
(recycled), controlling whether |
... |
additional graphical parameters forwarded to
|
Invisibly returns a list with components xlim and
ylim (the plot limits used).
The surface objects are converted to 'mesh3d' object before
applying further calculations.
When surface is a surface ieegio object, the returned
mesh3d$vb contains vertices that have been left-multiplied by
surface$geometry$transforms[[1]] (the first transform stored in the
geometry, typically the ScannerAnat or voxel-to-world transform).
Breaking change: Earlier versions (before 0.2.6) of ravetools
returned the raw surface$geometry$vertices without applying any
transform, so downstream code often multiplied by
surface$geometry$transforms[[1]] (or an equivalent) manually before
working in world space. Such code will now double
apply the transform and produce incorrect coordinates. If you previously
applied a transform from surface$geometry$transforms by hand after
calling a ravetools mesh function on an 'ieegio_surface',
remove that manual step.
Surfaces with an empty or missing geometry$transforms list (for
example, surfaces produced by ieegio's volume_to_surface,
which stores an identity transform) are unaffected.
If geometry$transforms contains multiple transforms targeting
different coordinate spaces, only the first one is used. Callers that need
a specific target space should select and apply that transform themselves
before calling ravetools mesh functions.
vcg_update_normals, vcg_isosurface
mesh <- vcg_isosurface(left_hippocampus_mask)
# Side view - rim-light shows the outline of the hippocampus
plot_mesh_dotcloud(
mesh,
eye = c(150, 0, 0),
lookat = c(0, 0, 0),
up = c(0, 0, 1),
col = "steelblue",
cex = 2
)
# Two meshes: surface + electrode point cloud
n_elec <- 20
electrodes <- structure(
list(vb = matrix(rnorm(3 * n_elec, sd = 5), 3, n_elec) +
rowMeans(mesh$vb)[1:3]),
class = "mesh3d"
)
plot_mesh_dotcloud(
mesh = list(mesh, electrodes),
eye = c(150, 0, 0),
lookat = c(0, 0, 0),
up = c(0, 0, 1),
col = list("steelblue", "red"),
pch = c(16L, 17L),
cex = c(2, 1.2)
)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.