Draws various types of arrows in a scene.

arrow3d(p0 = c(1, 1, 1), p1 = c(0, 0, 0), 
        barblen, s = 1/3, theta = pi/12, 
        type = c("extrusion", "lines", "flat", "rotation"), 
        n = 3, width = 1/3, thickness = 0.618 * width, 
        spriteOrigin = NULL, 
        plot = TRUE, ...)



The base of the arrow.


The head of the arrow.


The length of the barbs (in display coordinates). Default given by s.


The length of the barbs as a fraction of line length. Ignored if barblen is present.


Opening angle of barbs


Type of arrow to draw. Choose one from the list of defaults. Can be abbreviated. See below.


Number of barbs.


Width of shaft as fraction of barb width.


Thickness of shaft as fraction of barb width.


If arrow is to be replicated as sprites, the origins relative to which the sprites are drawn.


If TRUE (the default), plot the object; otherwise return the computed data that would be used to plot it.


Material properties passed to polygon3d, shade3d or segments3d.


Four types of arrows can be drawn. The shapes of all of them are affected by p0, p1, barblen, s, theta, material properties in ..., and spriteOrigin. Other parameters only affect some of the types, as shown.


(default) A 3-dimensional flat arrow, drawn with shade3d. Affected by width, thickness and smooth.


Drawn with lines, similar to arrows, drawn with segments3d. Affected by n.


A flat arrow, drawn with polygon3d. Affected by width and smooth.


A solid of rotation, drawn with shade3d. Affected by n and width.

Normally this function draws just one arrow from p0 to p1, but if spriteOrigin is given (in any form that xyz.coords(spriteOrigin) can handle), arrows will be drawn for each point specified, with p0 and p1 interpreted relative to those origins. The arrows will be drawn as 3D sprites which will maintain their orientation as the scene is rotated, so this is a good way to indicate particular locations of interest in the scene.


If plot = TRUE (the default), this is called mainly for the side effect of drawing the arrow; invisibly returns the id(s) of the objects drawn.

If plot = FALSE, the data that would be used in the plot (not including material properties) is returned.


Design based on heplots::arrow3d, which contains modifications by Michael Friendly to a function posted by Barry Rowlingson to R-help on 1/10/2010. Additions by Duncan Murdoch.


xyz <- matrix(rnorm(300), ncol = 3)
arrow3d(xyz[1,], xyz[2,], type = "extrusion", col = "red")
arrow3d(xyz[3,], xyz[4,], type = "flat",      col = "blue")
arrow3d(xyz[5,], xyz[6,], type = "rotation",  col = "green")
arrow3d(xyz[7,], xyz[8,], type = "lines",     col = "black")
arrow3d(spriteOrigin = xyz[9:12,],            col = "purple")