我正在尝试使用 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 可视化 目标是拥有像这样的干净网格:干净网格
以下是如何执行此操作的示例。 这可能不是使用
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)
这会产生这样的图像: