杨 波,樊超群
(中国电子科技集团第二十八研究所,江苏 南京 210004)
随着科学技术的发展,消防、公安、军事等领域对室内人员精准定位的需求日益增加,但精准室内定位显示要依赖于精确的三维建筑室内模型。目前常用的生成三维建筑模型的方法主要有基于无人机的倾斜摄影修正、基于BIM的Revit软件建模和3DMAX建模等,但这些方式基本都需要专业领域的工程师才能操作,并且完成一个完整的模型需要大量时间,无法满足消防和公安等实时使用的需求[1]。
本文将介绍以当前建筑行业广泛使用的AutoCAD二维建筑图样为基础,利用二次开发技术提取室内建筑模型要素,通过三维模型软件,快速简易生成精确三维室内建筑模型的方法。
目前常用的生成三维建筑模型的方法主要有基于无人机倾斜摄影修正、基于BIM的Revit软件建模和3DMAX建模等,下述简单介绍这几种方式。
1)无人机倾斜摄影。
通过无人机搭载数个专业高分辨率倾斜摄影相机,分别从不同方向沿事先规划好的航线拍摄目标建筑物,拍摄完成后根据GPS信息和惯性导航信息对数据进行几何校正处理,再利用专业的测绘软件通过多视角的影像运算出建筑模型,在此基础上再通过着色处理等方式形成倾斜摄影三维建筑模型[2]。
2)Revit软件建模。
Revit是Autodesk公司专为建筑信息模型(BIM)设计的,记录建筑的全生命周期,包括几何和非几何信息,但是需要专业建筑设计人员根据前期二维图样仔细设计所有建筑要素,比如立柱、墙体、门、窗等,通过逐层累加形成三维建筑模型[3]。
3)3DMAX建模。
3DMAX软件广泛应用于建筑设计、游戏、工业设计等领域,采用3DMAX创建三维建筑模型需要专业设计人员基于二维图样底图,对各要素进行造型、PS处理、贴图等操作,通过渲染使建筑模型比较逼真,最后将模型整体导入三维场景系统使用[4]。
上述3种方式都需要专业技术人员配合专用商业软件才能生成三维建筑模型,无法满足消防等领域即时性的要求。
本文设计一种基于二维AutoCAD图样快速生成三维建筑模型的方法,其包括基于二维图样图层的建筑特征要素数据输出和基于三维设计软件的三维建筑模型生成,主要有如下几个步骤。
1)导入楼层图样:将楼层建筑平面图加载到软件中。
2)提取图层信息:获取当前平面图图样的图层信息。
3)图层要素分类:根据预先设定要素,将图层分类。
4)输出特征要素文件:通过建筑物名称、楼层和楼高等信息输出特征要素数据文件。
5)生成建筑模型:利用解析过的特征要素数据,根据特征生成相应建筑模型。
流程图如图1所示。
AutoCAD二次开发方法有ObjectARX、VBA、AutoLISP和.NET等,本文主要介绍AutoCAD.NET二次开发方法。
AutoCAD.NET使用户可通过编程的方法利用程序集或开放库操作AutoCAD和图形文件。通过开放的对象,它们可被许多不同的编程语言和环境访问,AutoCAD.NET的API接口中有许多不同类型的对象,其对象模型之间的关系构成一种树状结构[5](见图2)。
在对象结构中以Application为基础,一个AutoCAD应用程序就是一个Application对象,通过Application对象,用户可以访问主窗口以及任何打开的图形。一旦用户获得了图形,就可以访问图形中的对象[6]。下述是本文用到的几个主要对象。
1)Document对象。
Document对象实际上就是AutoCAD图形,它是DocumentCollection对象的一部分,并提供访问与Document对象相关的Database对象。
Document对象提供访问图形状态栏(StatusBar)、document对象被打开的窗口(Window)、Editor(Editor)和事务管理器(TransactionManager)的对象。Editor提供用户以输入形式获取的点、输入字符串或数字值的功能。
2)Database对象。
Database对象包括所有的图形和大部分非图形的AutoCAD对象。被包含在Database中的一些对象有实体、符号表、命名字典。实体在Database中表示图样内部的图形对象。直线、圆、圆弧、文本、填充和多段线都是实体的一个例子。用户可以在屏幕上看到一个实体并可以操作它。用户通过Document对象的Database成员属性可以访问当前文档的Database对象。
3)图形和非图形对象。
图形对象,也称为图元,是组成图形的可见对象(例如直线、圆、光栅图像等)。添加图形对象到图形中是通过正确的块表记录引用,然后使用AppendEntity方法将一个新对象添加到图形中来完成的。
非图形对象是指属于图形的一部分但不可见的(提示性的)对象,例如Layers、Linetypes、DimStyles、TableStyle等。若要创建新的符号表记录,请使用表所有者的Add方法或使用SetAt方法添加一个字典到命令对象字典中[7]。
输出特征要素文件以C#.NET平台开发,图3所示为输出特征要素数据文件总体流程图,包括如下几个步骤。
1)导入楼层图样:将楼层建筑平面图加载到AutoCAD软件中(见图4)。
2)提取图层信息:获取当前平面图图样的图层信息。
3)图层要素分类:根据预先设定要素,将图层分类。
4)提取要素信息:根据特征要素提取对应图层中点、线、多线段和块等模型信息。
5)输出特征要素数据文件:通过建筑物名称、楼层和楼高等信息结合特征要素信息输出特征要素数据文件。
6)是否输出所有楼层:根据判断是否已完成所有楼层数据输出,如果已完成则结束,如果未完成则重复步骤1~5。
具体开发软件为VisualStudio 2010与AutoCAD 2014结合开发,首先加载AutoCAD指定目录的acdbmgb.dll与acmgb.dll作为引用文件,这2个文件是进行AutoCAD.NET二次开发必须引用的,通过AtuoCAD自定义菜单与代码中[CommandMethod("XXX")]字符关联调出软件主界面[8]。
在导入楼层图样后,通过界面读取当前图样的图层LayerTable信息,以列表形式展示并可以通过控制显隐来直观感受图层所对应的特征要素。接着按照预先设定墙体Wall、门窗Window和楼梯Stair等建筑要素将图层分类,再分别针对分类要素对相应图层的数据进行筛选提取,比如点Point3d、线Line、多线段Polyline和块BlockReference等,最后按照名称等建筑物总体属性,楼层高度等各楼层属性,墙、门窗和楼梯等楼层特征要素属性组织成对应XML文件输出[9]。
三维设计软件建筑模型生成流程如图5所示,包括如下几个步骤。
1)导入特征要素数据文件:导入整体建筑模型特征要素数据文件。
2)解析建筑要素:通过解析结构化文件识别各个特征要素数据。
3)生成建筑模型:利用解析过的特征要素数据,根据特征生成相应建筑模型。
以三维渲染效果较好的Unity3D为例,Unity3D方便的脚本编译接口,结合VS2010可快速部署开发环境。按照一定格式提供解析,依据解析的特征要素分别创建不同的Object,如楼层Object、墙Object、门窗Object和楼梯Object等。在Unity3D世界中Object形状由Mesh元素决定,而Mesh通过坐标点绘制而成,通过解析XML文件中存储的要素的坐标点,然后赋值给各要素对应的Mesh,就可绘制出Object的形状,从而构建出整个三维建筑模型。最后通过材质设置Material以使建筑更加逼真[10],最终效果如图6所示。
利用AutoCAD的二次开发技术进行建筑特征的信息提取导出中间模型数据,再结合三维模型软件二次开发解析数据快速生成三维建筑模型,该技术优点是操作界面简单,容易快速上手,适用于需要快速现场依据电子图样生成三维模型的需求,但也有相应的缺点,即需要二维和三维2种软件相结合。