如何使用R的rgl包as.mesh3d函数基于LiDAR点云生成3D网格并解决报错
问题解决:R语言rgl包处理LiDAR点云生成3D网格报错
报错根因
你遇到的报错由两个核心错误导致:
- 坐标矩阵构造错误:你使用
matrix(c(X,Y,Z), byrow = TRUE, ncol =3)生成的矩阵完全打乱了坐标对应关系,每一行并不是单个测点的x、y、z值,而是连续拼接的三个X值、三个X值以此类推。 as.mesh3d函数逻辑理解错误:该函数并不会自动对离散点云做三角网格重建,当指定type="triangle"时,它要求输入的顶点总数必须是3的倍数,且每3个连续顶点对应一个三角面的三个顶点。你的20个采样点不是3的倍数,所以直接触发顶点数量错误,哪怕是27000个离散点,没有预先确定三角面的顶点对应关系,直接输入也只会得到无意义的网格。
可行解决方案
针对建筑类LiDAR点云,最常用的方案是先做平面Delaunay三角剖分再生成网格,步骤如下:
1. 安装加载依赖包
# 首次运行先安装 # install.packages(c("rgl", "geometry")) library(rgl) library(geometry)
2. 修正坐标矩阵构造
X <- c(1566328,1566328,1566328,1566328,1566328,1566327,1566327,1566327, 1566327,1566327,1566327,1566327,1566327,1566327,1566327,1566327, 1566326,1566326,1566326,1566326) Y <- c(5180937,5180937,5180936,5180935,5180936,5180937,5180937,5180936, 5180936,5180935,5180935,5180935,5180936,5180936,5180937,5180938, 5180938,5180937,5180936,5180936) Z <- c(19.92300028,19.98300046,19.93700046,19.88099962,19.93500046,19.99500046, 20.00400046,20.00600046,19.97199962,19.92499962,19.95400046, 19.99099991,20.01199991,19.97600020,19.95800008,19.93200008, 19.95300008,19.94800008,19.94300020,19.98399991) # 正确构造坐标矩阵:每一行对应一个测点的x、y、z xyz <- cbind(X, Y, Z)
3. 三角剖分生成网格
# 对x、y平面做Delaunay三角剖分,得到每个三角面对应的顶点索引 tri_indices <- delaunayn(xyz[,1:2]) # 构造mesh3d对象 # 注意:mesh3d要求坐标矩阵每列对应一个点,所以需要对xyz转置;三角面索引也需要转置 building_mesh <- mesh3d(t(xyz), triangles = t(tri_indices), color = "red") # 可视化验证 shade3d(building_mesh)
扩展方案(适用于带立面的复杂建筑点云)
如果你的点云包含建筑立面数据,需要做三维重建,可以使用alphashape3d包生成alpha形状后转成网格:
# 首次运行先安装 # install.packages("alphashape3d") library(alphashape3d) # alpha参数可调整,数值越小网格越贴合点云,数值越大网格越平滑 ashape <- ashape3d(xyz, alpha = 2) building_mesh <- as.mesh3d(ashape) shade3d(building_mesh, col = "red")
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

