使用线框从R到HTML导出3D表面

时间:2016-09-30 03:00:24

标签: html r plot 3d rgl

{rgl}包中的writeWebGL函数可用于将交互式3D绘图导出为HTML(参见下面的示例)。

    require(rgl)
    jet.colors <-colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan",
                 "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000"))
    colorzjet <- jet.colors(100)
    data(volcano)
    z <- 5 * volcano        # Exaggerate the relief
    x <- 10 * (1:nrow(z))   # 10 meter spacing (S to N)
    y <- 10 * (1:ncol(z))  

    open3d()
    bg3d("white")
    material3d(col="black")
    persp3d(x, y, z, col = colorzjet[ findInterval(z, seq(min(z), max(z), length=100))], aspect="iso",axes = TRUE, box = FALSE, smooth=FALSE,lit=FALSE,front="fill")
    surface3d(x, y, z, front = "lines",col="black", lit=FALSE)

    browseURL(paste("file://", writeWebGL(dir=file.path("C:/", "webGL"), width=700), sep=""))

但是,它目前不支持线框或点渲染,这意味着3D曲面将导出为没有可见边的多边形。

有没有人知道这方面的方法? 我希望我的HTML文件显示3D表面上每个面的边缘。

1 个答案:

答案 0 :(得分:1)

您需要使用低级函数绘制点或边。分数很容易:

id <- surface3d(x, y, z, front = "lines",col="black", lit=FALSE)
vertices <- rgl.attrib(id, "vertices")
points3d(vertices)

执行线框更复杂,因为您需要连接正确的顶点。这里有几个可以做到的功能。

surfaceData <- function(id) {
  vertices <- rgl.attrib(id, "vertices")
  dim <- rgl.attrib(id, "dim")
  array(vertices, c(dim, 3))
}

surface2lines <- function(data, ...) {
  vertices <- NULL
  for (i in seq_len(dim(data)[1]))
    vertices <- rbind(vertices, data[i,,], c(NA, NA, NA)) 
  for (j in seq_len(dim(data)[2]))
    vertices <- rbind(vertices, data[,j,], c(NA, NA, NA))
  lines3d(vertices, ...) 
}

您调用surfaceData(id)来提取曲面的顶点,然后在该数组上surface2lines()绘制线条。例如,

id <- surface3d(x, y, z, front = "lines",col="black", lit=FALSE)
d <- surfaceData(id)
open3d()
surface2lines(d)

从您的数据中提供此图像:

wireframe image

你可以在表面上过度绘制;你很可能需要玩 depth_test属性可让它显示在表面之上。