persp3d                 package:rgl                 R Documentation

_S_u_r_f_a_c_e _p_l_o_t_s

_D_e_s_c_r_i_p_t_i_o_n:

     This function draws plots of surfaces over the x-y plane.
     'persp3d' is a generic function.

_U_s_a_g_e:

     persp3d(x, ...)

     ## Default S3 method:
     persp3d(x = seq(0, 1, len = nrow(z)), y = seq(0, 1, len = ncol(z)),
         z, xlim = range(x), ylim = range(y), zlim = range(z, na.rm = TRUE),
         xlab = NULL, ylab = NULL, zlab = NULL, add = FALSE, aspect = !add, ...)

_A_r_g_u_m_e_n_t_s:

    x, y: locations of grid lines at which the values in 'z' are
          measured.  These may be given as vectors or matrices. If
          vectors, they must be in ascending order.   Either one or
          both may matrices. If 'x' is a 'list', its components 'x$x'
          and 'x$y' are used for 'x' and 'y', respectively.

       z: a matrix containing the values to be plotted.   Note that 'x'
          can be used instead of 'z' for convenience.

xlim, ylim, zlim: x-, y-  and z-limits.  The plot is produced so that
          the rectangular volume defined by these limits is visible.

xlab, ylab, zlab: titles for the axes.  N.B. These must be character
          strings; expressions are not accepted.  Numbers will be
          coerced to character strings.

     add: whether to add the points to an existing plot.

  aspect: either a logical indicating whether to adjust the aspect
          ratio, or a new ratio

     ...: additional material parameters to be passed to 'surface3d'
          and 'decorate3d'.

_D_e_t_a_i_l_s:

     This is similar to 'persp' with user interaction.  See 'plot3d'
     for more details

     If the 'x' or 'y' argument is a matrix, then it must be of the
     same dimension as 'z', and the values in the matrix will be used
     for the corresponding coordinates. This is used to plot shapes
     such as spheres or cylinders where z is not a function of x and y.
      See the fourth and fifth examples below.

_V_a_l_u_e:

     This function is called for the side effect of drawing the plot. 
     A vector  of shape IDs is returned.

_A_u_t_h_o_r(_s):

     Duncan Murdoch

_S_e_e _A_l_s_o:

     'plot3d', 'persp'

_E_x_a_m_p_l_e_s:

     # (1) The Obligatory Mathematical surface.
     #     Rotated sinc function.

     x <- seq(-10, 10, length= 30)
     y <- x
     f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
     z <- outer(x, y, f)
     z[is.na(z)] <- 1
     open3d()
     bg3d("white")
     material3d(col="black")
     persp3d(x, y, z, aspect=c(1, 1, 0.5), col = "lightblue",
             xlab = "X", ylab = "Y", zlab = "Sinc( r )")

     # (2) Add to existing persp plot:

     xE <- c(-10,10); xy <- expand.grid(xE, xE)
     points3d(xy[,1], xy[,2], 6, col = 2, size = 3)
     lines3d(x, y=10, z= 6 + sin(x), col = 3)

     phi <- seq(0, 2*pi, len = 201)
     r1 <- 7.725 # radius of 2nd maximum
     xr <- r1 * cos(phi)
     yr <- r1 * sin(phi)
     lines3d(xr,yr, f(xr,yr), col = "pink", size = 2)

     # (3) Visualizing a simple DEM model

     z <- 2 * volcano        # Exaggerate the relief
     x <- 10 * (1:nrow(z))   # 10 meter spacing (S to N)
     y <- 10 * (1:ncol(z))   # 10 meter spacing (E to W)

     open3d()
     bg3d("slategray")
     material3d(col="black")
     persp3d(x, y, z, col = "green3", aspect="iso",
           axes = FALSE, box = FALSE)

     # (4) A cylindrical plot

     z <- matrix(seq(0, 1, len=50), 50, 50)
     theta <- t(z)
     r <- 1 + exp( -pmin( (z - theta)^2, (z - theta - 1)^2, (z - theta + 1)^2 )/0.01 )
     x <- r*cos(theta*2*pi)
     y <- r*sin(theta*2*pi)

     open3d()
     persp3d(x, y, z, col="red")

     # (5) A globe

     lat <- matrix(seq(90,-90, len=50)*pi/180, 50, 50, byrow=TRUE)
     long <- matrix(seq(-180, 180, len=50)*pi/180, 50, 50)

     r <- 6378.1 # radius of Earth in km
     x <- r*cos(lat)*cos(long)
     y <- r*cos(lat)*sin(long)
     z <- r*sin(lat)

     open3d()
     persp3d(x, y, z, col="white", 
            texture=system.file("textures/worldsmall.png",package="rgl"), 
            specular="black", axes=FALSE, box=FALSE, xlab="", ylab="", zlab="",
            normal_x=x, normal_y=y, normal_z=z)
     play3d(spin3d(axis=c(0,0,1), rpm=8), duration=5)

     ## Not run: 
     # This looks much better, but is slow because the texture is very big
     persp3d(x, y, z, col="white", 
            texture=system.file("textures/world.png",package="rgl"), 
            specular="black", axes=FALSE, box=FALSE, xlab="", ylab="", zlab="",
            normal_x=x, normal_y=y, normal_z=z)
     ## End(Not run)

