基于CityEngine规则技术批量构建三维模型分析
2018-10-15王媛媛
王媛媛
(吉林省水利水电勘测设计研究院,吉林 长春 130012)
随着GIS技术和计算机软、硬件技术的快速发展和推广,二维GIS应用已经不能满足目前很多方面的应用需求。二维GIS只能提供给用户平面的信息,而现实世界中,客观事物总是存在于三维空间的[1],对于三维空间中客观事物,用户只能通过想象或者工作经验来推断。与二维GIS相比,三维GIS通过构建三维模型场景给用户表现更真实的地理空间[2]。目前进行三维建模的作业流程是对场景模型进行逐一建模,业界通常使用的软件有3DMax、SketchUp等软件[3]。优点是软件的用户群体多、模型精确度较高;缺点是建模操作较繁琐、工作量大。ESRI公司的CityEngine软件最大的特点就是程序通过定义一系列的规则来驱动和约束三维场景的自动构建三维模型。这种技术改变了传统建模的方式,大大减少了重复性劳动和人力的投入。
1 技术路线
三维场景一般包含三维地形、影像、三维建筑物、道路、水系等要素。这些三维数据一般都是由二维的GIS数据经过三维技术处理获得的[4]。三维地形数据即DEM数据,有TIN和Grid两种格式;三维建筑物、道路和水系模型分别由二维的建筑物、道路、水系数据图层添加DEM高程信息来获取其三维数据进而创建三维模型。因此,在建模之前,需要收集场景区域的DEM、DOM、建筑物(面)、道路(面或线)、水系(面)等GIS数据。
使用ArcGIS工具将这些收集到的GIS数据进行处理,剔除错误、粗差并使之统一坐标系,编辑处理矢量数据的属性,添加字段,使GIS数据包含建模所需的基本信息。
将GIS数据导入到CityEngine场景中,创建场景及规则文件,创建规则变量并映射到GIS数据的相应属性,指定建模规则,应用规则文件批量构建场景内的三维模型,最后单独编辑场景中特殊模型。这样就完成了三维场景的批量建模工作,下面详细分析该技术路线的设计与实现过程。
2 设计与实现
2.1 数据准备
2.1.1 统一数据坐标系
收集到的场景区域的DEM、DOM、建筑物(面)、道路(面或线)、水系(面)等GIS数据,由于不一定是同源获取的,所以经常会遇到数据的坐标系不统一的情况,虽然CityEngine软件支持不同坐标系的数据在加载时自动进行数据投影,但是为了避免数据的投影变形,最好还是需要将所有的原始数据的坐标系进行统一。如果是同椭球不同投影带坐标系之间的转换,可以使用ARCGIS的坐标系投影工具将源坐标系投影到目标系;如果是不同椭球坐标系之间的转换,可以收集或实测场景区的转换参数,然后再使用ARCGIS的坐标系投影工具将源坐标系投影到目标系[5]。关于数据坐标系转换的详细说明本文中不作介绍。
2.1.2 二维GIS数据制作三维GIS数据
GIS数据包括空间数据和属性数据,空间数据用来表达地理空间实体的位置、大小、形状、方向以及几何拓扑关系,属性数据用来表达空间实体的空间属性以外的其他属性特征,属性数据主要是对空间数据的补充说明。GIS数据通常以点、线、面要素来分类组织和管理。二维的GIS数据为了能更好地贴合到三维地形(即DEM)上,需要将二维的GIS数据转换成三维GIS数据。
图1 “2Dto3D面”GP工具架构图
点要素:通过ArcToolbox的“Interpolate Shape”工具转化为3D点要素。并在属性字段中指定点要素的类型(如树木、路灯杆等)、高度等基本信息。
线要素:如果是双线道路,需要提取道路的中心线,然后再使用“Interpolate Shape”工具转化为3D线要素。并在属性字段中指定道路要素的宽度、车道数、路面材质(如沥青、水泥、砂石等)等基本信息。同理,其他线要素也要在属性中指定其必要的基本信息。
面要素:如果是双线道路面,需要提取道路的中心线,将其转化为线要素,再按上面线要素处理;如果是水系面,使用“面转线”工具将面转换为线要素[6],然后转换为3D要素,再使用“要素转面”工具转化为3D面要素;如果是建筑物基座面,处理会较为复杂,可以制作一个GP模型工具[7],命名为“2Dto3D面”,其架构如图1所示。运行该工具会输出两个要素类:“Building1_footprints3D”、“Building1_footprints3D_bufferline”。“Building1_footprints3D”是实际的3D建筑物基底面,其高程是建筑物基底面中心点在DEM上的投影高程,是一个平面;而“Building1_footprints3D_bufferline”是3D线要素,它的高程就是它在DEM上的插值高程,它将参与地形的编辑,使得建筑物基底面能更好地与地形贴合。编辑属性字段添加建筑物的楼层数、层高、屋顶类型、墙面材质等基本信息。
2.1.3 DEM编辑
使用ArcGIS加载这些数据源,可以看到在场景中一些3D要素并不能很好的与地形贴合(比如建筑物的基底),所以接下来要做的就是将地形的局部区域进行编辑,使之与3D要素更好地贴合。以建筑物基底处理为例来进行说明。如果DEM数据是TIN格式,则直接使用“编辑TIN”工具加入上面生成的“Building1_footprints3D_bufferline”要素类即可。如果DEM数据是Grid格式,则只需将Grid格式转换成TIN格式,再重复上步完成DEM编辑。
2.2 三维建模
2.2.1 主体建模
目前进行三维建模一般都使用3DMax、SketchUp等软件对场景模型进行逐一建模,以建筑物为例,很多建筑物的样式基本是一样的或者是类似的,按照目前的工作模式大大增加了重复性劳动。CityEngine最大的特点就是可以通过定义一系列的规则来驱动和约束三维场景中的模型的自动构建,进而达到批量自动建模的目的。
首先新建工程“CityEngine project”,新建场景“CityEngine scene”,命名该场景并设置该场景所使用的坐标系统为源数据的坐标系统。在场景中创建Terrain Layer加载DEM和DOM数据。然后在场景中导入三维GIS矢量数据及其属性,这样我们就能在后续的建模中通过映射实体属性来动态控制模型的自动创建。创建一个新规则,当然也可以导入一个已有的规则,下面以建筑物为例来说明如何通过定制规则自动创建建筑物模型。
选中建筑物层上所有的几何实体,通过鼠标右键工具“Assign Rule File…”引用到新建的规则文件,然后编写规则,如图2所示短短几行代码就可以自动生成所有的建筑物模型,建筑物高度为3m。当然还可以通过映射变量“height”到几何实体的属性,这样就可以根据属性值来生成不同高度的建筑物模型了[8]。
图2 cga规则文件及局部效果
图3 cag规则文件及局部效果图
2.2.2 屋顶建模
由于建筑物的屋顶多样化,考虑北方房屋多以平顶、双坡顶、四坡顶为多,下面就以这几类屋顶的建模规则定制进行详细说明。
平顶:最简单,建筑物默认屋顶即为平顶。也可使用roofShed[9]函数,倾角设置为0。
双坡顶:需要comp(f)函数将顶面分割出,然后使用roofGable[9]函数,其可以包含1~5个参数,一般默认3个就可以了,坡顶的角度(单位:度)、x方向房檐延伸长度(单位:m)、y方向房檐延伸长度(单位:m)。
四坡顶:需要comp(f)函数将顶面分割出,然后使用roofHip[9]函数,其可以包含1~3个参数,一般默认2个就可以了,坡顶的角度(单位:度)、四周房檐延伸长度(单位:m)。
图3即为映射实体屋顶的不同属性值自动构建的房屋白模。
2.2.3 纹理贴图
最后就是对模型的美化工程了,给模型贴上纹理图案,使模型看起来更接近于真实世界中的建筑物。我们可以将DOM影像数据作为建筑物的屋顶贴图,其他门、窗、墙壁材质贴图可以实地拍照采集。门窗的纹理贴图为同类型,如图4中“Door”贴图代码所示。屋顶贴图使用的是DOM影像,需要进行纹理的平移操作[10],如图4中“Roof”贴图所示,由于注释比较详细,在此就不在赘述了。
至此,建筑物的三维建模就已经完成了。使用规则创建模型的优势是可以通过改变规则来轻松地修改模型,规则带来了高效的同时,一点也没有降低三维建模的灵活度。例如,你可以通过规则来自动创建大部分的建筑物,而其中的个别建筑物,你可以通过在该建筑物的Inspector属性框中修改其属性来更详细控制建筑物模型的创建。
2.3 导入已有三维模型
如果已经有一些三维模型,这些模型是使用其他建模软件生成的,CityEngine可以很好的支持这些已有三维模型。如果模型带有空间地理坐标,可以直接将这些模型文件拖入到CityEngine场景中,当然也可以使用菜单“File/Import”导入工具,使用指定类型的导入器将选中的模型导入到场景中。反之,如果模型没有空间地理坐标信息,可以使用矢量轮廓面来为模型定位。
图4 cag规则文件及局部效果图
3 结语
基于CityEngine规则建模技术,通过创建规则文件,既能灵活地利用二维GIS数据,尤其是其属性数据,又能广泛兼容地利用多种外部资源(如纹理、已有模型等)来批量创建出较高质量的模型,大大减少了创建三维场景的建模工作量,极大地提高工作效率。