2016-09-30 3 views
2

{rgl} 패키지의 writeWebGL 함수를 사용하여 대화식 3D 플롯을 HTML로 내보낼 수 있습니다 (아래 예 참조).R에서 HTML로 와이어 프레임으로 3D 표면 내보내기

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="")) 

그것은, 그러나, 현재 3 차원 표면이 보이는 가장자리없이 다각형으로 수출 될 것을 의미, 와이어 프레임 또는 포인트 렌더링을 지원하지 않습니다.

그 방법을 알고있는 사람이 있습니까? 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, ...) 
} 

당신은 선을 음모 해당 배열에 다음, surface2lines()을 표면의 정점을 추출하는 surfaceData(id)를 호출합니다. 예를 들어,

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

는 데이터에서이 이미지를 준다 : 당신은 표면이 overplot 수

wireframe image

을; 표면 위에 표시되도록하려면 depth_test 속성으로 재생해야합니다.

+0

그것은 일했다! 고마워요! –