使用 rgl 的 extrude3d() 函数从 R 中的多边形制作 3D 网格

问题描述 投票:0回答:1

我正在尝试使用 R 制作 3D OBJ 文件。我的初始数据是具有多个多边形的 Geopackage。我想“挤压”每个多边形以使它们成为 3d 的。挤出量应由这些多边形的属性值决定。

我有一个包含多个多边形的地理包:数据列表屏幕截图。我能够以二维形式绘制这些数据。 二维数据图

每个多边形都有一个名为“POINT...50”的属性。我想使用此属性的值通过挤压每个多边形来确定每个多边形的高度(z 轴),但我无法让它工作。到目前为止,我已经尝试使用 extrude3d 函数来做到这一点。

这是我的初始数据。到目前为止,这是我的代码:

library(sf)
library(ggplot2)
library(rgl)
library(dplyr)

data <- st_read("data/métropole_de_lyon_LGT_LCI_500m.gpkg")

data|>
  ggplot() +
  geom_sf()

data |>
  extrude3d()

writeOBJ(data3D, '3d model')

我还使用 Rayshader 包来创建 3D 可视化,但问题是它对数据进行光栅化,因此输出的 OBJ 文件并不令人满意。所以我想要相同的结果,但只使用矢量来获得干净的 3D 网格。 使用 Rayshader 制作的 3D 可视化 目标是拥有像这样的干净网格:干净网格

r 3d rgl
1个回答
0
投票

以下是如何执行此操作的示例。 这可能不是使用

sf
的最巧妙方法,但它似乎有效。

library(sf)
library(rgl)
data <- st_read("~/temp/métropole_de_lyon_LGT_LCI_500m.gpkg")

open3d(useNULL = TRUE) # don't need to draw on screen yet

for (i in 1:nrow(data)) {
  thickness <- data[i,]$POINT...50
  if (!is.na(thickness))
    st_geometry(data)[[i]] |>
    as.matrix() |>
    extrude3d(thickness = thickness) |>
    shade3d()
}

writeOBJ("~/temp/test.obj", separateObjects = FALSE)

open3d(useNULL = FALSE) # Now draw the file we saved
readOBJ("~/temp/test.obj") |>
  shade3d(col = "red", alpha = 0.2)

这会产生这样的图像:

enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.