2016-09-30 21 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

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