How to make your own 3-D sculpture with R

[This article was first published on Revolutions, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

We've mentioned before how you can use R to design 3-D objects. Now, thanks to the latest version of the rgl package, you can produce real-world 3-D objects with R as well.

The rgl package has long made it possible to create virtual 3-D objects in R, and export them as animations like this:


But now, package author Duncan Murdoch has added the ability to export such 3-D objects in formats used by 3-D printers (such as STL, WebGL, PLY, and OBJ). Duncan used this feature to create the corresponding real-world sculpture below:

Duncan explained how he obtained the 3-D print via email:

I ordered it from, a service bureau that does 3D printing in a variety of materials. (They're in NYC, and were shut down for a few days by Hurricane Sandy, but still managed to get my print to me a day earlier than they promised to ship it!)  Including shipping to Canada, the cost was $22, and I had the print 11 days after I wrote the software.

The 3-D object file (in STL format) was created using just a few R commands and some elegant mathematics:

## Install rgl from R-forge with
## install.packages("rgl", repos="")
theta <- seq(0, 6*pi, len=2048)
sawtooth <- function(x) sin(x) + sin(2*x)/2
dsawtooth <- function(x) cos(x) + cos(2*x)
fb <- 21+1/3
x1 <- sawtooth(fb*theta)
dx1 <- dsawtooth(fb*theta)
offset <- 3*pi/3
y1 <- sawtooth(fb*theta - offset )
dy1 <- dsawtooth(fb*theta - offset)
r1 <- 0.1
r2 <- 0.4
k <- cylinder3d(cbind(sin(theta)+2*sin(2*theta), 2*sin(3*theta), cos(theta)-2*cos(2*theta)),
                      e1=cbind(cos(theta)+4*cos(2*theta), 6*cos(3*theta), sin(theta)+4*sin(2*theta)),
                      radius=0.8, closed=TRUE, keepVars=TRUE)
knot <- attr(k, "vars")
center <- cbind(0, x1, y1)*r2
e1 <- cbind(1, dx1, dy1)*r2
e2 <- cbind(rep(0, length(theta)), 1, 0)
for (i in 1:length(theta)) {
   trans <- cbind(knot$e1[i,], knot$e2[i,], knot$e3[i,])
   center[i,] <- knot$center[i,] + trans %*% center[i,]
   e1[i,] <- trans %*% e1[i,]
   e2[i,] <- trans %*% e2[i,]
braid <- addNormals(cylinder3d(center, e1=e1, e2=e2, radius=r1))
shade3d(braid, col="white")

Try it yourself! The package installed easily for me on a Mac running R 2.15.2, and I could also rotate the 3-D object interatively on-screen using the shade3d function. For more info, visit the rgl progect page linked below.

r-forge: rgl project page

To leave a comment for the author, please follow the link and comment on their blog: Revolutions. offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)