(长安大学 汽车学院,西安 710064)
随着计算机科学的飞速发展,虚拟现实技术日益成熟。作为虚拟现实技术的重要表现形式,视景仿真技术广泛应用于虚拟驾驶、军事演练、城市交通仿真等领域[1]。其中,在城市交通仿真领域,视景仿真是城市交通仿真研究的必要前提[2]。城市交通视景仿真以计算机技术为依托,利用系统仿真模型模拟城市交通系统的运行状态,其对交通流、交通事故等交通现象的模拟[3],为城市道路设计、城市规划等项目提供较为详尽的交通参数和技术支持。但城市交通系统运行复杂、城市环境要素多种多样(包含车辆、建筑、公交站牌、行人等)[4]。为满足城市交通仿真效果的真实性、流畅性,提升视景环境的沉浸感,场景建模及视景仿真技术的运用,则成为城市交通视景仿真的关键[5]。对此,相关文献运用多种方法提升视景仿真效果,其中,文献[6]利用multigen creator/Vega Prime平台完成三维场景建模,并阐述建模一般步骤,但未对模型优化展开深入研究;文献[7]采用multigen creator与3DMAX联合建模建立沈阳市三维模型,解决模型逼真度问题,但未对模型渲染效率进一步探讨;文献[8]利用3DMAX三维建模技术以及Java编程语言完成了虚拟城市广场漫游导航系统的搭建,实现了模型与程序之间有机结合,但功能较为单一,系统流畅性有待改进。
针对上述问题,本文基于主流三维建模技术和视景仿真平台,提出适用于城市交通虚拟环境构建的视景仿真框架,对视景仿真过程中的关键技术进行分析研究,并将主要关键技术应用于城市交通视景仿真系统的构建。关键技术的应用显著提升了仿真系统的实时渲染及加载响应速度,并取得高流畅性、高逼真度的视景仿真效果。
城市交通视景仿真总体框架如图1所示。视景仿真主要包括城市交通三维模型建立、场景模型优化、Vega Prime配置、VC++程序设计四部分。为满足视景仿真实时性高、加载响应迅速等要求,需将模型建立、模型优化、Vega Prime配置、程序调用四部分有机结合,充分发挥各部分优势。
图1 城市交通视景仿真总体框架
视景仿真步骤如下:
1)城市交通环境三维建模。利用Multigen Creator与3D MAX对城市交通场景联合建模,模型包括路面地形模型、道路环境模型、动态场景模型三部分,其中动态场景模型用于程序调用。将场景模型储存为flt文件。
2)场景模型优化。对场景进行改进,通过模型节点优化、纹理细节优化等技术,以提高渲染效率。并将模型flt文件封装为vsb格式的二进制文件,可明显提升加载效率,缩短模型加载响应时间。
3)Vega Prime配置。利用Vega Prime面向对象、功能模块化、平台兼容性好的优点[9],完成模型文件(vsb文件)加载,城市交通视景环境初始配置(视点位置、视点运动、路径规划等)工作,并生成环境初始配置文件(acf文件)。
4)VC++程序。编制VC++主程序,并调用Vega Prime函数库进行联合开发,实现场景驱动以及视景中运动节点(DOF节点、Switch节点)的控制。
作为视景仿真过程中的关键要素,三维模型的建立需要具备高效、便捷、可视化程度高等特点,选择合适的视景仿真建模软件,对视景仿真系统的搭建十分重要。本文采用3D MAX与Multigen Creator联合建模,其建模流程如图2所示。
图2 Multigen creator与3D MAX联合建模流程图
城市交通场景中模型元素复杂多样,为兼顾场景精细度与流畅度,本文采用虚拟场景分开再合并的方式进行建模。联合建模流程如下:
1)建立纹理贴图库。采用实地拍摄、颜色材质替换等方法收集贴图素材,并对素材进行补光、裁剪等图像处理,丰富纹理贴图库;
2)建立三维模型。利用Multigen Creator多边形建模的优势,进行地形、树木、道路等模型的搭建,利用3D MAX强大的点、线、面以及几何体编辑功能建立复杂模型,如车辆、房屋等;
3)场景模型整合。3D MAX模型通过obj文件导入Multigen Creator,由于3D MAX模型三角面较多,需进行合并细小面、减少多边形面处理[10],整合后的场景贴图还可转换为rgb格式,丰富纹理库。
城市交通环境要素复杂,涉及众多三维实体,如车辆、树木、路灯、立交桥等,需建立数量庞大的三维模型,针对众多模型,需对场景合理优化以满足视景仿真实时性、流畅性的需求。
2.2.1 子纹理贴图优化
为达到逼真显示效果,三维模型建立后常利用纹理映射技术将二位图像映射到模型表面[11]。但creator对纹理贴图分辨率有所限制:贴图长和宽限制为2的幂次方个像素单位,即图像分辨率为2n×2n。当贴图分辨率尺寸不满足2的幂次方像素单位要求时,系统会自动分配更大内存来存储贴图,以分辨率大小为180×420为例,其尺寸分配如图3所示。这样会造成内存资源浪费,影响贴图的加载与渲染效率。
图3 纹理原始尺寸与内存分配尺寸关系图
在众多城市场景要素中,不规则纹理的存在不可避免,就需对其进行子纹理贴图优化,即将各个分散的不规则纹理合并为一个主纹理,合并原理如图4所示,其中A、B、C、D、E表示子纹理贴图或透明图像留白,以分辨率1024×1024图像为例,子纹理合并实例如图5所示。主纹理映射方法与其他纹理映射方法相同,需重新建立纹理映射关系。优化后主纹理分辨率最大不应超过1024×1024,以缩短模型加载过程中纹理解压时间。
图4 子纹理合并图
图5 合并纹理图
2.2.2 层级结构节点优化
Multigen Creator采用层级结构进行三维模型的存储[12-13],层级结构如图6所示,节点的层级结构影响视景渲染过程中节点的生成与剔除。视景渲染时,会遍历所有数据库节点,并根据节点位置是否在可视范围内进行节点的截取计算,渲染可视范围内节点,并剔除可视范围之外的节点。
图6 Multigen Creator层级结构图
城市交通场景复杂,元素种类众多,建模过程中,为方便模型统一管理,易于修改、调用,常采用逻辑结构建立模型数据库,如创建树、房屋、车道、交通灯、公交站等组节点,并将树、房屋等体节点放置在对应组节点下,节点信息如图7所示。
图7 模型数据库逻辑结构
逻辑结构建立的模型数据库条理清晰、易于管理,但会影响模型渲染过程中节点的剔除与加载速度。场景制作完成后,需按照空间位置将组节点重新划分,本文将整体场景按照空间几何形状分为7块,每块含有多种城市元素,节点信息如图8所示。
图8 模型数据库空间结构
2.2.3 模型封装技术
城市交通场景元素复杂,导致原始flt模型文件较大,严重增加场景加载时间,利用to_vsb.exe工具将flt文件封装为vsb格式的二进制文件,可大大提升模型文件加载效率[14]。VSB(Vega Scene Graphic Binary)是一种不可编辑的场景文件格式,专门用于Vega Prime模型文件的加载,其具有模型解压速度快、忽略纹理路径影响、封装元素全面等优点。但在格式转换时也应注意以下两点:
1)纹理贴图与vsb文件需放入同一文件夹。文件转换时,转换工具忽略贴图加载路径,只将同一文件夹下的flt文件与贴图文件打包入同一个vsb文件,如文件夹下无贴图文件,则只转换白模型。
2)建立精细树模型,不可进行vsb格式转换。精细树模型需以替换场景中普通树模型的方式进行加载,其通过寻找flt文件中树木模型路径及名称进行精细树替换,而vsb文件不包含树木模型路径信息,丢失的信息会影响精细树的生成。
2.3.1 Switch节点驱动
作为城市视景环境重要标志之一,交通灯模型必不可少,本文采用switch节点技术进行信号灯模拟仿真,switch节点技术可将不同体模型放置在同一节点下,并通过函数调用控制节点下模型变换。交通灯模型制作中,将创建完成的红、绿、黄3个体节点放置在同一个switch节点下,设置switch节点,并按顺序对3个颜色体节点编号(如表1),以便于通过时间间隔控制节点变换,节点设置如图9所示。
表1 颜色编号
图9 switch节点设置
图10 switch节点控制流程图
VC++调用vega API函数获取仿真时间T,通过遍历节点找出特定switch节点,并根据仿真时间与不同信号灯之间的时间间隔确定switch节点中的index值,然后通过判断车辆位置实现车辆是否闯红灯判定,节点控制流程如图10所示,控制switch节点关键代码如下:
vsSwitch *mySwitch; //定义switch节点
tempNode =find_named("switch");//寻找switch节点
mySwitch = (vsSwitch *)tempNode;//将switch节点赋予mySwitch
Time=vpKernel::instance()->getSimulationTime();//获取仿真时间
mySwitch->setActiveMask(0);//实现红灯渲染
mySwitch->setActiveMask(1);//实现绿灯渲染
mySwitch->setActiveMask(2);//实现黄灯渲染
2.3.2 DOF节点驱动
DOF节点可控制其所有子节点按照设置的自由度移动或旋转,赋予模型运动的能力。城市交通场景中,车轮的旋转与转向、雨刮的摇摆、虚拟仪表盘的建立等都适合DOF节点技术创建。
DOF节点的创建,需对目标模型创建局部坐标系O’x’y’z’,其示意如图11所示,DOF节点封装有2个仿射变换矩阵T1、T2。T1矩阵用来描述局部坐标系相对于世界坐标系的位置、平移、缩放等变换,T2矩阵则模型物体相对于局部坐标系的位置、平移、缩放等变换。其矩阵可表示为:
图11 DOF节点示意图
图12 DOF节点设置
与switch节点驱动类似,DOF节点驱动也需对模型节点遍历,并找出特定DOF节点,对节点模型设置运动状态,实现驾驶人与车辆模型间的交互功能。控制DOF节点关键代码如下:
vsDOF *wiperDOF;//定义DOF节点
wiperDOF = (vsDOF*)m_car_obj->find_named("wiper");//寻找节点并将其赋予wiperDOF
Time=vpKernel::instance()->getSimulationTime();//获取仿真时间
wiperDOF ->setRotateH( 2, true);//驱动DOF节点,并设置每一帧旋转角度为2°
wiperDOF ->setRotateH( 0, true);// 设置每一帧旋转角度为0°,DOF节点旋转停止
应用上述视景建模与仿真技术,构建城市交通视景仿真系统,硬件配置:CPU为Intel i7-8700 3.2 GHz,内存16 G,硬盘2TB,显卡为GTX 1070;软件配置:操作系统Windows10,Multigen Creator,3D MAX,Vega Prime,Microsoft Visual C++。
视景驱动效果如图13~14所示。采用Multigen Creator与3D MAX联合建模,将多种元素模型有机结合,资源利用合理,可在满足场景逼真度的同时,兼顾视景仿真的实时性。节点动态驱动技术的运用,使场景要素更加丰富,场景更贴近真实,还原度更高,仿真效果良好。
图13 房屋视景仿真效果
图14 交通路口和立交桥视景仿真效果
场景加载与渲染效率方面也有较大提升,模型优化技术应用前后实时性能对比如表2所示。从表中得知,简单场景下,模型封装技术可明显提升场景加载效率,其加载时间为6 s,约为未使用封装技术场景加载时间的1/3,模型优化技术可一定程度上提升场景流畅度,其剔除和渲染时间相较未使用优化技术的场景有约2 ms的缩短;复杂场景下,优化与封装技术的优势进一步扩大,模型封装技术的使用可将场景加载时间缩短为原来的1/6,约为21 s,而在采用模型优化技术后,场景平均帧率维持在37帧/s左右,提升约为30%,平均剔除和渲染时间为8.4 ms和8.2 ms,缩短为原来的1/2。
表2 关键技术应用前后实时性能对比
本文提出一种基于VC++与Vega Prime联合仿真的城市交通视景仿真框架,解决了城市视景仿真中实时性差、还原度较低的问题,并就其中关键建模技术、模型优化技术以及节点动态驱动技术作重点研究。Multigen Creator与3D MAX联合建模技术满足场景逼真度的同时,兼顾了仿真实时性需求,模型优化技术的使用大大提升了视景加载及渲染效率,节点动态驱动技术丰富了场景元素,场景还原度更高。示例效果显示,优化技术的应用使视景加载与渲染效率大幅提升,视景仿真系统提供了逼真的图形画质,并以较高的城市交通还原度,实现了高沉浸感的视景仿真效果,为进一步的城市交通流模拟训练、驾驶人应激等研究提供基础。