This creates a function to use with play3d to spin an RGL scene at a fixed rate.

spin3d(axis = c(0, 0, 1), rpm = 5,
       dev = cur3d(), subscene = par3d("listeners", dev = dev))



The desired axis of rotation


The rotation speed in rotations per minute


Which RGL device to use


Which subscene to use


A function with header function(time, base = M), where M

is the result of par3d("userMatrix") at the time the function is created. This function calculates and returns a list containing userMatrix updated by spinning the base matrix for time seconds at rpm revolutions per minute about the specified axis.


Prior to rgl version 0.95.1476, the subscene argument defaulted to the current subscene, and any additional entries would be ignored by play3d. The current default value of par3d("listeners", dev = dev) means that all subscenes that share mouse responses will also share modifications by this function.


Duncan Murdoch

See also

play3d to play the animation


# Spin one object
plot3d(oh3d(col = "lightblue", alpha = 0.5))

if (!rgl.useNULL() && interactive()) play3d(spin3d(axis = c(1, 0, 0), rpm = 30), duration = 2) # Show spinning sprites, and rotate the whole view open3d() spriteid <- NULL spin1 <- spin3d(rpm = 4.5 ) # the scene spinner spin2 <- spin3d(rpm = 9 ) # the sprite spinner f <- function(time) { par3d(skipRedraw = TRUE) # stops intermediate redraws on.exit(par3d(skipRedraw = FALSE)) # redraw at the end pop3d(id = spriteid) # delete the old sprite cubeid <- shade3d(cube3d(), col = "red") spriteid <<- sprites3d(0:1, 0:1, 0:1, shape = cubeid, userMatrix = spin2(time, base = spin1(time)$userMatrix)$userMatrix) spin1(time) } if (!rgl.useNULL() && interactive()) play3d(f, duration = 2)