1、背景介绍
在提取建筑物轮廓点后,对轮廓点进行简化得到建筑物轮廓线。将轮廓线进行拉伸,变可得到建筑物白膜,如下图所示。这种形状比较简单,所重建模型实质上就是一个个立方体盒子,缺少屋顶细节,视觉观感上并不好。
建筑物白膜(缺少屋顶结构信息)
但实际上,真实建筑物屋顶结构各不相同,由不同面片构成,具有复杂的屋顶结构,如下图所示。
![]() | ![]() | ![]() |
2、基于CGAL自动生成斜坡屋顶
一般的建筑物轮廓线矢量数据中并没有建筑物屋顶信息,相比较光秃秃的白模,如果能加上屋顶,其视觉观感就会好很多。本次介绍一种利用CGAL自动添加斜坡屋顶的方法。CGAL有个算法可以自动生成2D多边形骨架线,叫2D Straight Skeleton。具体的生成原理,可以去看官网上介绍。此次主要介绍如何利用CGAL生成屋顶,并使用PCL进行可视化显示。
2.1 环境配置
本次程序需要安装依赖CGAL、PCL,其安装配置环境参考之前博客。本次实验在PCL1.11、CGAL5.5版本上运行。其中安装参考博客:
CGAL参考博客:CGAL环境配置(VS2019 PCL1.8)-CSDN博客
PCL参考博客:win11+VS2019下配置PCL1.11.1-CSDN博客
2.2 骨架线生成
建筑物骨架线实质是对于一个闭合的多边形,在其内部生成其他线段。如下图所示,黑色线段为建筑物外轮廓,红色线段为骨架线。在CGAL库中,本质是生成了新的顶点,顶点与边相连,即可生成骨架线。
建筑物轮廓与骨架示意图
生成骨架线API接口示例:
SsPtr iss = CGAL::create_interior_straight_skeleton_2(poly.vertices_begin(),
poly.vertices_end());
2.3 三维模型可视化
当然,生成的内部点是二维,没有高度,那么如何生成三维模型呢?可以采用如下简单策略:
(1)所有的外轮廓点,高程设置一个高度;
(2)所有的内部点,高程设置成另一个高度,一般是比外轮廓点高;
(3)对每个面对应的点,直接连接
可视化函数接口示例:
viewer->addPolygon<pcl::PointXYZ>(contour, r, g, b, str);
3、测试与可视化
程序运行环境 :
PCL 1.11
CGAL 5.5
VS2019
3.1 骨架线生成测试
假设组成外轮廓的形状如下,总共由A、B、C、D、E、F组成,每个点坐标如下:
A(0,0)、B(20,0)、C(20,20)、D(10,20)、E(10,10)、F(0,10)。具体可参考如下:
轮廓点分布示意图
利用CGAL中骨架线生成函数create_interior_straight_skeleton_2,运行结果如下,总共生成了6个面,其中每个面组成的点数各不相同。如第一个面由3个点组成,三个点坐标为(0,0)、(5,5)、(0,10)组成。可以发现点(5,5)是生成点,(0,0)、(0,10)为轮廓边缘点,为已有点。
分析每个面对应的点,其满足如下规律:
(1)首尾两个点为边缘点,非首尾点为生成的新的点
(2)按照点的顺序进行连接,是一个闭合的能够刻画真实形状的多边形
生成的面片
3.2 多边形可视化
假设生成的点高程一样(z坐标相同),原始边缘点高程一样,将每个面对应的多边形进行可视化,结果如下。从俯视静态图,同一多边形颜色相同。三维动图展示了屋顶的三维空间结构,由6个面组成,每个面形状、高度各不相同。
![]() | ![]() | ![]() |
俯视截图静态图 | 三维框线动图 | 三维面动图 |
L型屋顶测试
从俯视静态图,同一多边形颜色相同。三维动图展示了屋顶的三维空间结构,由8个面组成,每个面形状、高度各不相同。
![]() | ![]() | ![]() |
俯视截图静态图 | 三维框线动图 | 三维面动图 |
凹型屋顶测试
4、总结
详细介绍使用CGAL中骨架线生成方法,快速生成屋顶结构。