测绘地理信息   2017, Vol. 42 Issue (5): 92-95
0
基于CityEngine的建筑物自动化建模[PDF全文]
赵明月1, 吴健平1    
1. 华东师范大学地理信息科学教育部重点实验室, 上海,200241
摘要: 传统的三维建模方法需要耗费大量的人力和时间,效率低且可重复利用的程度不高。CityEngine作为一个新的三维建模软件,支持基于规则的CGA(computer generated architecture)方法,建模速度快,模型重用度高,且与ArcGIS软件能很好结合。介绍了在CityEngine中创建规则文件的方法以及基于Python脚本的建筑物自动化三维建模方法,并通过实例演示自动化建模过程。
关键词: CityEngine     CGA规则     三维建模     自动化建模    
Automatic Building Modeling Based on CityEngine
ZHAO Mingyue1, WU Jianping1    
1. Key Laboratory of Geographic Information Science, Ministry of Education, East China Normal University, Shanghai 200241, China
Abstract: Traditional building modeling methods often require much time and manpower with low efficiency and poor reusability. As a new modeling software, CityEngine supports CGA (computer generated architecture) rules. It can achieve a fast and reusable modeling, and have good compatibility with ArcGIS software. In this paper, we introduce the method of creating rules files in CityEngine and the method of buildings automatic three-dimensional modeling based on Pythonscript. Furthermore, we also use an example to show the procedure of automatic building modeling.
Key words: CityEngine     CGA rules     3D modeling     automatic building modeling    

近年来, 全国很多城市都在进行数字城市建设, 推进城市信息化进程[1, 2]。数字城市是运用3S、遥测、仿真-虚拟等技术,以计算机技术、多媒体技术和大规模存储技术为基础,以宽带网络为纽带,实现对城市多尺度、多时空、多分辨率以及多种类的三维描述[3]。城市三维描述的核心是构建建筑物三维模型,数字城市建设对城市建筑物三维建模有两方面的要求:一是模型的精细化,构建的三维建筑物模型越精细,效果越逼真; 二是建模过程的自动化,自动化程度越高,操作越简单,效率越高。

在建筑物三维建模方面,娄启业等研究了基于AutoCAD和3DS Max进行建筑物三维建模的方法[4]; 张习科等利用Skyline和3DS Max构建湖南城市学院校园主要建筑物三维模型[5]; 吴森等基于Skyline生成地形模型,并构建了西南科技大学三维数字校园[6]; 王新志等研究了基于SketchUp的校园三维建模方法[7]; 万宝林将SketchUp和3DS Max分别与ArcGIS结合,研究了一体化建模流程,并进行了对比分析[8]; 朱安峰等基于CityEngine实现了河南大学三维数字校园系统[9]; 张晖等研究了基于CityEngine的室内三维建模的方法[10]

传统的三维建模软件(如3DS Max等)采用手工建模的方法,建模过程费时、费力[10],且模型重用度低。作为新的三维建模软件,CityEngine支持基于CGA规则的建模方法,建模速度快,模型重用度高,既可以读取ArcGIS中的shapefile数据,也可以导出多种格式(包括ArcGIS支持的Multipatch格式)的三维模型。

本文主要介绍在CityEngine中基于CGA规则的建筑物建模方法,并介绍基于Python脚本实现建筑物自动化建模的过程。

1 创建CGA规则文件

CGA规则文件一般存放在工程文件的rules文件夹下,创建CGA规则文件的方法是:右击CityEngine工作空间中的项目工程rules文件夹,通过菜单中new下的CGA Rule File菜单命令来创建。通过CityEngine提供的编辑窗口编辑CGA文件。CGA文件通常包含如下内容:① 建筑物的属性定义; ② 建筑物的图形操作; ③ 建筑物面的纹理贴图。

1.1 建筑物的属性定义

建筑物属性值的类型包括数值型和字符串型,通常数值型属性值表示建筑物的高度、宽度等,字符串型属性值代表贴图文件的路径及文件名,表示对贴图的引用。直接用属性值编写CGA规则时,如果属性值发生改变,在规则文件中修改属性值时会存在很大的不便,另外未经定义的属性值不能在Inspector窗口的属性面板中查看和编辑建筑物属性值。为方便起见,通常为建筑物的一些属性值进行“常量”的定义,如果属性值发生变化,只需在定义处进行修改。

属性定义的格式为attr name=value,其中name表示对建筑物属性的命名,value表示属性值。如attr Height=20表示高度为20 m; attr WindowImage=“window/window.tif”表示建筑物窗户的贴图路径为window文件夹下的window.tif文件。

1.2 建筑物的图形操作

图形操作主要有extrude、comp、split、texture等命令,如表 1所示。

表 1 常用图形操作命令及其作用 Table 1 Frequently-used Rules and Their Meanings

建筑物由二维到三维的拉伸过程由extrude命令完成,其格式为:extrude(Height),其中,Height为数值型,表示拉伸长度。拉伸后二维矢量图变成三维立体图。图 1图 2分别为二维矢量图和三维立体图。

图 1 二维矢量图 Figure 1 2D Vector Graph

图 2 三维立体图 Figure 2 3D Stereogram

通常建筑物各个面的设计是不同的,所以在建模时需要将建筑物各个面划分出来,并对其命名,然后编写对应的规则。建筑物各个面的处理主要用comp命令,其格式为:comp(type) {id1:name1 | id2:name2...| id(n):name(n)},其中type表示划分类型,包括三种类型:fev分别表示对面、边、点进行划分; id1, id2, …, id(n)表示划分对象的编号,name1, name2, …, name(n)表示对划分对象的命名。

拉伸后,模型底面和顶面对应的id分别为0和1,侧面的id从2开始,与原矢量数据的节点编号有关,对于不规则图形的矢量数据,可以根据其节点编号确定多面体侧面的id。对于四边形,拉伸后成为六面体,其6个面可用前、后、左、右、上、下表示(对应的id可以是front、back、left、right、top、bottom,也可以是2、3、4、5、6、1、0)。id为“side”时,表示侧面划分后剩余的一个或多个侧面成为一个整体。图 3为模型面的划分图。

图 3 三维建筑物面的划分 Figure 3 Division of Horizontal of 3D Building

建筑物一般有多个楼层,并且楼层有门、窗等部分,所以需要对建筑物的面进行切割,并对各切割部分进行贴图。面的切割过程主要用split命令。该命令格式为:split(axis){size1:name1|size2:name2|…|size(n):name(n)},其中axis为切割方向,其值为xyzx为切割面第一条边对应的方向,y为在该面上x方向的正交方向,z为该切割面的法线方向; size1, size2, …, size(n)为切割长度,可以是相对长度(带前缀’)、绝对长度或浮动长度(带有前缀~); name1,name2,…,name(n)表示对切割出部分的命名。切割时,通常有循环过程,“*”表示重复执行,如split(y){3:floors}*表示以3 m为高度循环纵向切割。图 4为切割图。

图 4 切割图 Figure 4 Results of Splitting

1.3 建筑物面的纹理贴图

纹理是物体表面的沟纹,也包括光滑表面上的彩色图案。CityEngine中建筑物的纹理由纹理贴图完成。纹理贴图操作主要由setupProjection、texture、projectUV命令完成。setupProjection用于设置纹理图层、纹理投影面和纹理大小,其命令格式为:setupProjection (uvSet, axesSelector, texWidth, texHeight),其中uvSet为整数,取值范围为[0, 5],表示不同的贴图效果,0为颜色贴图,1为凹凸贴图,2为光影贴图,3为高光贴图,4为透明贴图,5为普通贴图; axesSelector为纹理投影面,取值为scope.xy、scope.xz、scope.yx、scope.yz、scope.zx、scope.zy和world.xy、world.xz、world.yx、world.yz、world.zx、world.zy,scope表示贴图面坐标系,world表示场景坐标系; texWidth和texHeight为纹理的宽度和长度,如果绝对的宽度和长度无法确定,可以用相对比例表示,前缀“ ' ”表示纹理与需要贴图部分的相对比例。texture用于定义贴图的路径及文件名,其格式为:texture (path),其中path为纹理贴图的路径及文件名,贴图可以是一般的图片或.obj文件格式。projectUV格式为:projectUV (uvSet),其中,uvSet与setupProjection命令的参数保持一致。图 5为纹理贴图后的结果。

图 5 建筑物门、窗及墙面贴图 Figure 5 Texture Operation for Doors, Windows and Walls

2 Python脚本实现建筑物自动化建模

CityEngine内置了Python编程语言和Python脚本编辑器,并提供了一个针对CityEngine的Python模块——scripting模块,CE类是scripting模块中的一个类,它封装了读写和编辑CityEngine内部数据的API函数。CE类具有的主要属性和方法如表 2所示。

表 2 CE类的主要属性和方法 Table 2 Main Attributes and Methods of CE Class

利用Python脚本实现建筑物自动化建模主要有以下6个过程:① 实例化CityEngine; ② 新建场景文件; ③ 定义坐标系统; ④ 导入二维矢量数据; ⑤ 生成CityEngine三维场景模型; ⑥ 导出三维模型。

生成CityEngine三维场景模型的过程需要调用规则文件,通过规则文件生成相应的建筑物模型。对多个模型进行自动化建模时,可以在ArcGIS中为二维矢量数据的属性表增加一个字段,用于存放对应的规则文件名,Python脚本通过循环读取各数据的记录,根据对应的规则文件生成建筑物三维模型。

3 应用实例

以华东师范大学图书馆为应用实例,基于CityEngine创建三维模型。前期已有的数据包括:记录建筑物平面形状的shapefile数据、实地拍摄的建筑物外表照片等。通过测量得到建筑物高30 m,由照片获得建筑物各部分的相对比例。

图书馆裙楼共5层,裙楼正面左侧为平面,中间为弧形面,右侧为平面,左侧为墙面,墙面上每层分布有横向和纵向排列的两排窗; 中间弧形面第一层以门为主,第二层及以上以窗户为主; 右侧平面左边为窗户,右边为墙面,墙面上有不规则分布的窗户和“图书馆”字体。在工程文件rules文件夹下新建CGA文件lib.cga,编写规则文件时,通过extrude将矢量图拉伸为三维模型,由comp命令对模型的面进行划分,并对各面进行切割操作和贴图操作。

以右侧平面为例,介绍该面的切割和贴图过程。由该平面窗户的分布可以看出需要先进行横向切割,可以切割为窗户、墙面、窗户、墙面、带有窗户和字体的墙面等5部分,各自所占比例为0.25、0.2、0.05、0.1、0.4。即

Facade-->split(x){′0.25:window_a|′0.2:wall|′0.05:window_b|′0.1:wall|′0.4:window_c}

对于第一部分window_a,表示纵向按楼层高度切割,每层按窗户宽度横向切割,切割出窗户; 对于第二部分和第四部分的墙面,直接贴图; 对于第三部分window_b,表示纵向切割出墙面、窗户、墙面3部分,相对比例为1:12:1,并对窗户再进行纵向切割,切割出窗户; 对于第五部分,需要纵向切割出每一层。

根据每一层的横向和纵向切割,切割出窗户和字体等部分,以带有“图”字和窗户的第五层为例。

FifthFloor→split(x){′0.4:split(y){~1:wall|~1:part1|~1:wall}|′0.6:part2}

part1→split(x){2:window_2}*

part2→split(y){~1:wall|3:split(x){~1:wall|3:tu_tex|1:wall}|1:wall}

其中,window_1、window_2、wall、tu_tex为窗户1、窗户2、墙面、“图”字的纹理贴图操作,以“图”字贴图为例:

tu_tex→

setupProjection(0, scope.xy, ′1, ′1)

projectUV(0)

texture(″assets/library/tu.tif″)

裙楼CGA文件编写完成后,可以通过Python脚本实现自动化建模,脚本运行时,调用CGA规则文件,运行后可以得到CityEngine场景模型以及导出的三维模型。

导出的MultiPatch格式三维模型加载到ArcScene中,同时加载矢量数据library.shp,加载后数据之间完全吻合,即导出的三维模型可以在ArcScene中与原矢量数据叠置。图 6为导出的三维模型在ArcScene中的显示效果,可以看出,CityEngine创建的建筑物模型比较逼真,实现了精细化建模。Python脚本将新建场景、导入数据等过程自动化,使建模过程更加方便、快捷。

图 6 模型在ArcScene中显示图 Figure 6 Model Display in ArcScene

参考文献
[1] 杨建思, 陈永喜. 城市三维信息系统的实现方法[J]. 武汉大学学报(工学版), 2001, 34(6): 67–70
[2] 赵相伟, 靳奉祥, 李云岭, 等. 城市三维建模方法与应用研究[C]. 测绘通报, 2009(4): 11-13
http://kns.cnki.net/KCMS/detail/detail.aspx?filename=chxg200904004&dbname=CJFD&dbcode=CJFQ
[3] 顾朝林, 孙毅中. 论"数字城市"及其三维再现关键技术[J]. 地理研究, 2002, 21(1): 14–24
[4] 娄启业, 程效军, 谭凯. 基于AutoCAD和3DMax的建筑物三维建模[J]. 工程勘察, 2013, 41(11): 71–74 DOI: 10.3969/j.issn.1000-1433.2013.11.017
[5] 张习科, 薛云, 彭祺. 基于Skyline的三维数字校园建模与实现——以湖南城市学院为例[J]. 湖南城市学院学报(自然科学版), 2015, 24(1): 74–78
[6] 吴森, 武锋强, 李虎杰, 等. 基于Skyline的三维数字校园系统[J]. 西南科技大学学报, 2012, 27(2): 73–76
[7] 王新志, 薛鹏飞. 基于SketchUp与VRP的交互式虚拟数字校园构建与实现[J]. 测绘与空间地理信息, 2012, 35(6): 108–111
[8] 万宝林. 3D SMAX与SketchUp的三维城市建模技术实验对比分析[J]. 测绘地理信息, 2015, 40(2): 23–25
[9] 朱安峰, 王海鹰, 高金顶. 基于CityEngine的三维数字校园系统[J]. 计算机系统应用, 2015, 24(2): 112–115
[10] 张晖, 刘超, 李妍, 等. 基于CityEngine的建筑物三维建模技术研究[J]. 测绘通报, 2014, (11): 108–112