热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python建筑建模_基于CityEngine的建筑物自动化建模

近年来,全国很多城市都在进行数字城市建设,推进城市信息化进程[。数字城市是运用3S、遥测、仿真-虚拟等技术,以计算机技术、多媒体技术和大规模存储技术为基础࿰

近年来, 全国很多城市都在进行数字城市建设, 推进城市信息化进程[。数字城市是运用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 " alt="" />

建筑物由二维到三维的拉伸过程由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



推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
pea101
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有