R: Create a function to spin a scene at a fixed rate

spin3d {rgl} | R Documentation

## Create a function to spin a scene at a fixed rate

### Description

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

### Usage

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

### Arguments

`axis` | The desired axis of rotation
`rpm` | The rotation speed in rotations per minute
`dev` | Which rgl device to use
`subscene` | Which subscene to use

### Value

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`.

### Note

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.

### Author(s)

Duncan Murdoch

### See Also

`play3d` to play the animation

### Examples

    # Spin one object
    open3d()
    plot3d(oh3d(col = "lightblue", alpha = 0.5))
    if (!rgl.useNULL())
      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

        rgl.pop(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())
      play3d(f, duration = 2)

[Package rgl version 0.99.9 Index]