倾斜摄影测量与SketchUp二次开发技术相结合的建筑三维重建

2017-06-19 18:47詹总谦李一挥桂鑫源
测绘通报 2017年5期
关键词:二次开发纹理建模

詹总谦,李一挥,桂鑫源

(武汉大学测绘学院,湖北 武汉 430079)

倾斜摄影测量与SketchUp二次开发技术相结合的建筑三维重建

詹总谦,李一挥,桂鑫源

(武汉大学测绘学院,湖北 武汉 430079)

结合SketchUp建模灵活、简单易学及摄影测量精度高的优势,利用SketchUp Ruby二次开发技术,对倾斜摄影测量单像建模、摄影测量模块与SketchUp Ruby脚本插件的通信、建模效果等方面进行深入研究,解决了用C++和Ruby联合开发SketchUp三维建模插件的关键技术问题。

SketchUp Ruby二次开发;倾斜摄影测量;建筑物重建;单像建模

建筑物重建是构建数字城市的重要内容之一,在城市规划、灾害应急、通信设施建设等领域具有广泛应用[1]。传统建模方法主要利用3ds Max、Maya、SketchUp等三维建模软件[2-4],通过现场拍照、手工建模、纹理贴图等步骤进行重建,工作量大、精度不高;利用LiDAR技术可以高精度、高密度地获取地物三维坐标,但设备成本高,建模算法尚不成熟[5];采用全自动实景三维建模技术的商用软件有Street Factory和Smart3D等[6-7],该技术自动化程度高、宏观效果好,但细节粗糙、模型非单体化,后期处理烦琐,软件价格也相当昂贵。

文献[8—9]阐述了利用倾斜摄影测量和3ds Max二次开发技术快速实现城市建筑物三维建模的方法,提高了建模的精度和效率。但3ds Max操作复杂,难以在短时间内熟练掌握。而SketchUp简单易学、视角灵活,建模效率优于3ds Max等软件,已成为建筑设计、园林景观等领域的主流软件[10]。SketchUp采用Ruby作为二次开发语言,是一种简单快捷、面向对象、自动垃圾回收(Garbage Collection)的脚本语言,开发效率优于C++和Java[11]。

本文在SketchUp软件环境下,结合倾斜摄影测量技术[12-13],实现单像建模方法,开发了建筑物半自动三维重建插件。该插件可通过人机交互的测量方法,快速、高精度实现建筑物三维模型的几何重建和纹理映射等过程。

1 技术方法

1.1 技术框架

本方法首先以动态链接库形式制作倾斜摄影测量量测模块,然后建立Ruby脚本、SketchUp建模API函数、摄影测量量测模块之间的通信,进而实现SketchUp中摄影测量插件的开发。整体技术框架如图1所示。

该技术以倾斜摄影测量空三加密成果和影像数据作为摄影测量模块输入,技术流程描述如下:首先通过双像立体或单像建模方式获取建筑物关键点坐标数据;然后将坐标数据传递给Ruby脚本,脚本调用API函数创建建筑物几何模型;最后,使用Ruby脚本将几何模型所有坐标信息传递给摄影测量模块,获取最佳纹理后由Ruby脚本读取,调用API函数完成纹理映射。

图1 整体技术框架

1.2 数据通信

1.2.1 C++摄影测量模块向Ruby传递数据

摄影测量模块与Ruby脚本需要分别获取对方的函数指针,进而通过参数传递完成通信。Fiddle是Ruby用来包装其他语言函数接口的一个扩展,可实现跨语言的调用[14]。本方法中利用Fiddle::Pointer类来处理C/C++类型的指针。由于C++数组内存空间是连续的,而Ruby数组中的各个元素则是随机存储在操作系统的堆内存(System Heap)中的(对象的引用保存在Ruby Heaps中,它独立于操作系统的堆之外),两种数组结构差异较大,因此Ruby无法直接读取C++传进的double或int型数组[11]。Ruby字符串是一个C语言的RString结构体,包含了一个char*类型的指针,指向字符串的值,该值存储在连续内存空间中(如图2所示),结构与C++数组相似。因此,可以将C++摄影测量模块的坐标数据转化为字符数组后传入Ruby,再转为相应的整型或浮点型即可。

图2 Ruby数组、字符串存储方式

1.2.2 Ruby向C++摄影测量模块传递数据

Ruby中的数组类型为Array,而Array的pack方法可以将数组的值压缩为一个二进制序列[15],将所有元素的值存储在一段连续的内存空间中。压缩得到的二进制序列对象的引用与C++指针类型相同,作为参数传入摄影测量模块后可以直接根据下标访问各元素。

1.3 量测与建模

1.3.1 单像量测

除了文献[9]介绍的双像立体建模方法之外,本技术还采用了单像建模方法。流程描述如下:首先在双像立体建模界面中量测基准平面,包括水平基准面、垂直基准面和任意空间基准面;然后切换到单像建模界面,通过量测建筑关键点像点坐标,并利用摄影测量知识确定该像点与投影中心的空间光线;最后,计算空间光线与基准平面的交点坐标,该点即为关键点的空间坐标。如图3所示,用户只需在单张影像上描绘建筑物轮廓线即可完成测量。

图3 单像量测

1.3.2 模型构建

SketchUp API中Entities类的add_face方法可以根据Point3d数组、Edge数组创建一个多边形,add_edges方法用来创建多个线段,add_arc、add_circle和add_curve方法分别用于创建弧段、圆和曲线实体[16]。SketchUp中没有“体”的概念,所有的三维立体模型都是由多个面构成的。对于Face对象,pushpull(推拉)方法可以沿法向挤出生成棱柱形的多面体。

建筑分为平顶房屋和复杂房屋两类进行创建。对于平顶房屋,先测得顶面,然后在单像视图中推拉出整个建筑模型(如图4(a)所示)。对于复杂房屋,则需要进一步测量屋脊线的位置(如图4(b)所示),然后在SketchUp中构面即可。

图4 平顶、复杂房屋建模

1.4 纹理自动映射

[9]的方法进行最佳纹理搜索,具体映射流程如下:

(1) 将模型点的三维坐标传入摄影测量模块,并根据共线方程和外方位元素选出模型面可见且完整的影像。然后,根据纹理面积最大原则选出最佳影像,按照最小外包矩形在影像上截取纹理。

(2) 在Ruby脚本中读取纹理(SketchUp环境中无需将纹理尺寸归一化为2n大小),并计算模型点的纹理坐标,要求坐标原点定义在纹理图片的左下角,大小在[0,1]区间内。

(3) 调用Model类的materials方法获取材质集合,向其中添加新的材质,材质的纹理(Texture)属性设置为截取的纹理图像。

(4) 调用Face类中的position_material方法,将模型点的物方坐标和对应的纹理坐标对应,实现纹理的透视变换,其效果如图5所示。

图5 纹理映射效果

1.5 双视图协同建模

为了提高建模效率及获取最佳建模体验,实现时需要保证摄影测量模块与SketchUp的数据模型和建模方式一致,形成双视图协同建模、无缝切换。其中,摄影测量建模视图可以利用矢量数据与影像的套合程度进行质量控制,使用户体验到所见即所得效果(如图6所示);而SketchUp建模视图则可以充分利用软件的灵活视角及丰富的建模工具,对模型的细节加以完善。

图6 双视图协同建模

2 建模效果

为验证本技术的有效性,采用德国某地区的倾斜影像,对几种典型建筑和街区进行建模,影像与模型效果如图7—图9所示。

图7 人字形屋脊房屋建模效果

图8 尖塔房屋建模效果

图9 复杂房屋建模效果

如图10所示(测区一角),对于结构比较简单的平顶和人字形屋脊房屋而言,在保证精度的情况下,建模效率约为每分钟1~2个模型。由于目前的纹理映射方法需要遍历较多的原始影像以获取最佳纹理,并且SketchUp尚不支持多核运算,因此纹理映射的效率仍然有待进一步提高。

图10 整体建模效果

3 结 语

利用SketchUp Ruby二次开发技术与倾斜摄影测量原理,对城市建筑物半自动、快速三维重建进行了技术研究和实现,重点解决了C++开发的摄影测量模块与Ruby脚本插件间的通信等关键技术问题,取得了较好的建模效果。

参考文献:

[1] 杨建思, 杜志强, 彭正洪, 等. 数字城市三维景观模型的建模技术[J]. 武汉大学学报(工学版), 2003,36(3):37-40.

[2] 李俊超, 李楼. AutoCAD Civil 3D和3ds Max Design在道路建模中的应用[J]. 测绘通报, 2013(2):91-94.

[3] 许捍卫, 房晓亮, 任家勇, 等. 基于SketchUp的城市三维建模技术[J]. 测绘科学, 2011,36(1):213-214.

[4] 周晓风. 基于MAYA和VIRTOOLS的虚拟仓储物流系统的研究与实现[D].上海:上海交通大学, 2011.

[5] 李广云, 李明磊, 王力, 等. 地面激光扫描点云数据预处理综述[J]. 测绘通报, 2015(11):1-3.

[6] 刘云峰, 张雪萍, 郭秋燕, 等. 基于Street Factory的城市三维模型构建方法研究[J]. 测绘与空间地理信息, 2014(12):67-70.

[7] 张骥, 高钊, 陈容. 基于Leica RCD 30倾斜航摄仪和Smart 3D技术快速进行城市三维实景生产[J]. 测绘技术装备, 2014(3):61-64.

[8] 王庆栋. 新型倾斜航空摄影技术在城市建模中的应用研究[D]. 兰州:兰州交通大学, 2013.

[9] 王庆栋, 艾海滨, 张力. 利用倾斜摄影和3ds Max技术快速实现城市建模[J]. 测绘科学, 2014,39(6):74-78.

[10] 鲁英灿, 康玉芳, 方旭,等. 设计大师SketchUp提高[M].北京: 清华大学出版社, 2006.

[11] FLANAGAN D, 松本行弘. Ruby编程语言[M]. 北京: 电子工业出版社, 2009.

[12] 李德仁, 肖雄武, 郭丙轩, 等. 倾斜影像自动空三及其在城市真三维模型重建中的应用[J]. 武汉大学学报(信息科学版), 2016,41(6):711-721.

[13] 张春森, 张卫龙, 郭丙轩, 等. 倾斜影像的三维纹理快速重建[J]. 测绘学报, 2015,44(7):782-790.

[14] SEGAL L. Class Module: Fiddle [EB/OL].[2016-08-16]. http:∥www.rubydoc.info/stdlib/fiddle/Fiddle.

[15] BRITT J, NEUROGAMI M. Array [EB/OL].[2015-12-23]. http:∥ruby-doc.org/core-1.9.3/Array.html#method-i-pack.

[16] SCARPINO M. Automatic SketchUp Creating 3-D Models in Ruby[M]. Hanover: Eclipse Engineering LLC, 2010.

Building Reconstruction Based on Oblique Photogrammetry and SketchUp Secondary Development

ZHAN Zongqian,LI Yihui,GUI Xinyuan

(School of Geodesy and Geomatics, Wuhan University, Wuhan 430079, China)

Combining the advantages of SketchUp including flexible modeling, learnability and high precision of photogrammetry, with using the technology of SketchUp Ruby secondary development, this paper studied on single-image modeling, the communication between photogrammetry module and SketchUp Ruby scripts and the refinement of 3D model. Finally, it solved the key technical problem of hybrid programming of C++ and Ruby to develop SketchUp plug-in.

SketchUp Ruby secondary development; oblique photogrammetry; building reconstruction; single-image modeling

詹总谦,李一挥,桂鑫源.倾斜摄影测量与SketchUp二次开发技术相结合的建筑三维重建[J].测绘通报,2017(5):71-74.

10.13474/j.cnki.11-2246.2017.0157.

2016-10-28;

2017-01-20

国家重点研发计划项目(2016YFB0501403)

詹总谦(1978—),男,博士,副教授,研究方向为数字摄影测量与计算机视觉。E-mail:zqzhan@sgg.whu.edu.cn

P23

A

0494-0911(2017)05-0071-04

猜你喜欢
二次开发纹理建模
联想等效,拓展建模——以“带电小球在等效场中做圆周运动”为例
基于BM3D的复杂纹理区域图像去噪
西门子Operate高级编程的旋转坐标系二次开发
浅谈Mastercam后处理器的二次开发
使用纹理叠加添加艺术画特效
基于PSS/E的风电场建模与动态分析
不对称半桥变换器的建模与仿真
西门子Easy Screen对倒棱机床界面二次开发
TEXTURE ON TEXTURE质地上的纹理
消除凹凸纹理有妙招!