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

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

传统的三维建模软件(如3DS Max等)采用手工建模的方法,建模过程费时、费力[,且模型重用度低。作为新的三维建模软件,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(Table 1)

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

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

命令

作用

extrude

对二维图形进行拉伸

comp

将拉伸后三维模型的各个面划分成不同部分,并定义各部分的名称

split

对图形进行横向或纵向切割

texture

贴图操作

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

图 1(Figure 1)

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

图 2(Figure 2)

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

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

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

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

图 4(Figure 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(Figure 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(Table 2)

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

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

属性和方法

含义

ce.newFile(self, workspacePath, interactive)

创建一个新场景,其中workspacePath是场景路径及名称,interactive是布尔型,默认值为False。

setSceneCoordSystem (self, description)

为场景定义坐标系统,其中description是投影坐标系统以proj4、WKT或CODE格式文件的内容。

importFile (self, filesystemPath, importSettings, interactive)

导入矢量数据,其中filesystemPath为矢量数据的路径及文件名,importSettings默认值为None,interactive是布尔型,默认值为False。

ce.setStartRule (self, shapes, rule)

设置起始规则

ce.setRuleFile(self, shapes, workspacePath, hasToExist)

为矢量数据(shapes)赋予CGA规则文件(rule),其中shapes为矢量数据,workspacePath默认值为None,hasToExist是布尔型,默认值为False。

generateModels (self, shapes, synchronous, updateSeed)

对shapes矢量数据生产三维模型,其中synchronous和updateSeed是布尔型,前者默认值为True,后者默认值为False。

refreshWorkspace (self)

刷新场景

利用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(Figure 6)

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

python 建筑建模_基于CityEngine的建筑物自动化建模相关推荐

  1. sklearn的pca建模_基于pca和内容的建模,用于英雄推荐英雄联盟

    sklearn的pca建模 Note: All the code for the below can be found here. 注意:以下所有代码均可在此处找到. Previously I wro ...

  2. python建筑案例_有哪些关于 Python 在建筑中的应用和教程?

    当绝大部分建筑师都认为Python的应用仅仅是在参数化设计的时候,将Python和数据挖掘技术应用在建筑的其他方面就显得更加有意义. 用Python做数据分析,首先要有数据库 首先看一下相关的数据集, ...

  3. python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...

    Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium .Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozi ...

  4. python遥感图像处理_基于Python的矿山遥感监测系统开发方法

    目前,很多学者都是从宏观上讨论遥感和GIS一体化集成的可能性及集成的方法,但这些研究在GIS和RS方向只是对Python集成研究的思路或某一功能的介绍,并没有一个基于Python开发的集成GIS与RS ...

  5. python实现案例_基于Python实现相关分析案例

    节选自<Python预测之美:数据分析与算法实战>. 相关关系是一种非确定的关系,就好像身高与体重的关系一样,它们之间不能用一个固定的函数关系来表示.而相关分析就是研究这种随机变量间相关关 ...

  6. python地图匹配_基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法

    1. 摘要 本篇博客简单介绍下用隐马尔科夫模型(Hidden Markov Model, HMM)来解决地图匹配(Map-Matching)问题.转载请注明网址. 2. Map-Matching(MM ...

  7. 浙江农林大学python期末考试_基于Python的地图匹配最短路径法实现

    117 科学论坛 在智能交通领域,众所周知,智能 交通系统在当今世界道路交通网络的管 理中发挥着重要的作用,而车辆导航系 统又是智能交通系统的重要组成部分. 在车辆导航系统中,定位的精确性和实 时性是 ...

  8. python 建筑计算_制图小技巧:巧用Python和ELK瞬间完成总图建筑名称标注

    哎呦,又到了每周一次的制图教室啦.经过前面两次制图教程的分享,相信大家对于白模填色和写实渲染这两种表达方式肯定有了较好的掌握. 那么今天我们就转战制图技巧篇,和童鞋们聊一下总平面图中的建筑名称标注问题 ...

  9. python 量化交易_基于Python的量化交易工具清单(上)

    -- Python量化工具清单 -- 以下内容来源于Wilson Freitas的Github项目"Awesome Quant".原文中包含了丰富的语言类别,但是后续介绍主要针对P ...

最新文章

  1. 图解用Scientific Toolworks Understand分析Winpcap SDK 4.1.3自带示例
  2. Java 8 - 时间API
  3. 数字语音信号处理学习笔记——语音信号的同态处理(2)
  4. silence丶你的名字
  5. can协议crc计算_详解CAN/CAN FD通信中的循环冗余校验(CRC)方法
  6. 【原】Redis事务管理
  7. js判断页面点击事件
  8. 鸿蒙2.0内测版手机版,不再遮遮掩掩,鸿蒙2.0测试版下月发布,用于手机内测
  9. ubuntu 下codeblocks的相关配置
  10. cad相对坐标快捷键_cad相对坐标怎么输入?CAD中输入西安80坐标绘图的教程
  11. 大数据发展的根基是什么?
  12. 工商银行近20年实时大数据平台建设历程
  13. 计算机怎么连接手机网络,电脑怎么连接手机的热点上网?
  14. 一位计算机专业硕士毕业生的求职经历和感想
  15. html5 3d场景设计,基于 HTML5 WebGL 的加油站 3D 可视化监控
  16. 西瓜书-2.5偏差与方差
  17. 计算机考研专业课考c语言的大学,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  18. 半年时间破获电信诈骗大案:我是如何利用数据分析建模,从零基础做到的
  19. 用于高频接收器和发射器的锁相环(PLL)——第一部分 PLL的基本概念
  20. yum出现Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile解决方法

热门文章

  1. 线路位宽与 CPU 位宽
  2. 【转】VMWare虚拟机linux访问windows主机硬盘文件方法
  3. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理和区块链技术的乘客智能报警系统》案例的界面简介、功能介绍分享之区块链技术
  4. 动手学深度学习V2.0(Pytorch)——10.感知机(激活函数)
  5. 售电系统服务器不能创建对象,基于网络的IC卡预付费售电管理系统之通讯问题创新.doc...
  6. 云服务器 ftp上传文件大小,云服务器 ftp上传文件大小
  7. android gmail 不翻墙,Android延迟Gmail消息通知,可能只是为了省电
  8. 河南科技职业大学计算机应用工程专业代码,河南科技职业大学
  9. 六月总结笔记(有道云链接)
  10. linux基础及命令详细教学