2016-09-30 26 views
2

{rgl}包中的writeWebGL函数可用于将交互式3D图导出为HTML(请参见下面的示例)。使用线框从R导出HTML表面到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表面上每个面的边缘。

+0

谢谢你'aspect =“iso”'我真的需要,似乎没有文档。 –

回答

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

你可以overplot这在表面上;您可能需要使用 depth_test属性才能使其显示在表面之上。

+0

它的工作!非常感谢你! –