魏远航 朱钱洪 李晓俊
摘要:CityEngine在高效迅速生成大规模三维场景模型方面具有较大的技术优势,然而在建模完成后导出为obj模型常发生扭曲变形的情况。本文从OBJ模型数据结构和存储的角度进行分析,探究其形成原因并提出了相应的解决方案。
关键词:CityEngine,obj,扭曲变形
中图分类号:TP391 文献标识码:A
文章编号:1009-3044(2020)18-00010-02
开放科学(资源服务)标识码(OSID):
1 引言
CityEngine建模是一种基于规则的快速三维建模方法,能调用建筑物底面矢量数据中属性字段,进行程序批量快速建模,充分利用了已有的数据,同时提高了效率,为大场景三维建模提供了一种新的方法[1-3]。CityEngine高效迅速生成大场景模型的秘诀是其采用了CGA语言(Computer Generated Architec-ture)作为设计语言,通过预定义各类规则并将其赋予对应的矢量面,迅速生成模型。这种批量建模技术非常适合对模型本身精细度要求不高但场景很大的工作(如规划三维效果展示)。
OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导,作为一种文本文件格式,采用单纯的字典状结构,易于存储[4-5]。然而在实际应用中,经常出现Citven-gine建模完成后导出为obj模型发生扭曲变形的情况,在其他三维平台(如3Dmax)无法正常显示。这对于Cityengine建模的后续分析和应用造成了困难。本文拟从OBJ模型数据结构和存储的角度进行分析,探究其形成原因并提出相应的解决方案。
2 OBJ模型数据结构
OBJ模型文件是Alias公司开发的一种标准三维模型文件格式[6],主流的软件平台(如Maya、3D max)一般都支持OBJ格式。OBJ模型以文本文件存储,构成模型的点、矢量、模型坐标是明码标记,非常利用用户对其进行查看和编辑。
OBJ模型文件一般包括obj文件和mtl文件组成,mtl是材质索引库文件,本文不作讨论。Obj文件是由一行行的文本构成,可以随意加入空行和注释行[7-9]。有效内容部分由关键字(Key-word)开头,关键字标记了该行的含义和作用[10]。obj常用的关键字及含义如下所示。
3 变形原因分析
使用规则文件在Cityengine中构建的模型以及导出的obj模型对比如图1所示(左侧为obj模型,右侧为cityengine软件显示模型),对比两者可以发现obj模型变形较为严重,几乎所有面都发生不同程度的变形,进一步分析可知:(1)变形的方向在于平面方向,垂直方向几乎没有发生位移;(2)贴图的方向都属正常,面的朝向大致也正常。
根据上文对obj文件数据结构的剖析,贴图方向和面朝向正常可以判断vn、vt、f参数应该属于正常,变形的方向可以初步判断v参数的x和z值可能存在问题。为了进一步分析其顶点坐标值存在的误差,检查了obj文件中存在变形的某一面的顶点坐标的情况,如下所示。
# mesh 'cut_mesh_2from geometry ' cut_mesh_2'
v 35614275.632 341.446 -3221109.749
v 35614275.632 345.446 -3221109.749
v 35614281.306 341.446 -3221111.697
v 35614281.306 345.446 -3221111.697
#4 vertices
vt 0.0000 0.0000
vt l.0000 0.0000
vt l.0000 1.0000
vt 0.0000 1.0000
#4 texture coordinates
g cut_mesh_2
s off
usemtl CityEngineMaterial_4
f 43/33 45/34 46/35 44/36
#1 face
所選分析面是obj模型中屋顶部分,从obj模型的侧视图可以看出该面为不规则四边形,而从obj文件顶点坐标来看属于矩形,坐标值与模型显示效果明显不符合(如图2所示)。因此可以判断obj文件中顶点坐标值是正确的,扭曲的原因应当发生在软件读取或显示的过程中。
进一步研究发现,obj文件顶点坐标值是以float类型读写的,而obj文件是以文本文件存储的,理论上可以存储double型的数值。上文中的v参数中x坐标值继承了Cityengine中底面矢量数据的平面坐标系x值(double类型)。由于float类型最大只能保留7位有效数字,而平面x坐标整数位有8位,y坐标整数位有7位,因此在读写时精度必然受到损失。
4 解决方案及验证
在三维GIS研究和工作中,不可避免的会使用到高斯平面坐标等数值较大的底面矢量数据,在此基础上使用Cityengine生成模型通常都会遇到变形扭曲的问题。经过上文分析,发现扭曲变形的主要原因是位数较大的x、z轴坐标值,而v值(对应于高程)一般整数不超过4位数,不存在变形问题。
本文提出两种解决方法解决上述问题:(1)在建模前对矢量文件进行坐标转换,转换为不加代号坐标,即可将精度至少提升到小数位后1位,满足一般的建模精度;(2)在建模前将矢量中心平移至坐标0点,建模后反向平移,精度至少提升至厘米级,但建模范围大致必须在以中心点lOkm范围内。
将建模前建筑物地面矢量数据进行坐标转换,由Xian_1980_3_Degree_GK_20ne_35转换为Xian_1980_3_De-gree_GK_CM_105E,同步将矢量数据平移至坐标0点,将两者分别导入Cityengine进行规则建模,导出的obj模型如下所示。
通过最终导出obj模型效果的对比可以发现,两种解决方案得到的obj模型均不存在明显变形扭曲,但是坐标转换的方法在细节处依然存在轻微的变形,这是由于平面坐标只能精确到小数点后1位导致的,而将矢量平移至0点的方法则不存在任何变形问题,精度较高。5总结
Obj模型具有文件组织结构简单,易于存储的特点,是三维模型的通用格式之一,非常利于软件平台之间的衔接,然而对于三维GIS应用,特别是大场景的模型构建存在坐标读写精度的缺陷。测绘行业的高斯平面坐标一般都是数位较高的双精度值,对于obj单精度读写的特性会产生顶点坐标精度降低,模型扭曲变形的风险,本质上是由传统三维建模行业和测绘行业研究对象差异引起的。
本文对于上述问题提出了两种解决方案,第一种方法操作简单但是精度略低,第二种方法精度高但操作步骤更复杂,很好地解决了Cityengine导出模型扭曲变形的问题。近年来,三维建模以及三维空间分析技术快速发展,对于三维模型数据通用性提出了更高的要求,作者也期待在测绘行业尽早形成相应的三维数据规范,以促进三维技术应用更快的发展。 参考文献:
[1]谢衍忆,黄良平,陈元增,等,基于CityEngine的城市三维快速建模方法及应用[J].地理空间信息,2016,14(2):39-40,62,8.
[2]邹倩.CityEngine在不动产登记三维建模与数据库设计研究[D].合肥:合肥工业大学,2016.
[3]王璐,朱小燕,谷中仁.基于CityEngine的校园三维模型建模研究[J].电子世界,2015(21):30-32.
[4]肖健,魏雄,王仁波.基于OpenGL的大型建筑三维场景模拟的实现与意义[J].电子质量,2016(11):88-92.
[5]李宁,段国林,许红静.Pro/E与ADAMS之间的数据交换方式的研究[Jl‘机械设计,2012,29(9):36-40.
[6]趙艳松.基于gITF的三维模型服务关键技术研究与实现[D].西安:西安电子科技大学,2017.
[7]王金峰,姚国清.三维模型文件中的OBJ格式在OpenGL中的输入与处理[Jl.电脑知识与技术,2011,7(10):2393-2396。2399.
[8]谢利明.基于OpenGL的自动化立体仓库仿真平台设计[D].河北:河北大学,2012.
[9]王清,张必兰.基于增强现实的安卓英语单词识记软件的设计与实现[J].电脑知识与技术(学术交流),2014(9X): 6431-6433,6435.
【通联编辑:唐一东】
基金项目:重庆市国土房管科技项目(KJ-2019010):倾斜摄影实景三维模型在村镇规划中的应用研究
作者简介:魏远航(1989-),男,重庆人,助理工程师,工学学士,主要研究方向为三维建模和无人机遥感。