范世博,卜凡亮
(中国人民公安大学信息技术与网络安全学院,北京 102623)
近年来,我国机动车的数量猛增,全国的大中小城市都面临着不同程度的交通拥挤状况,交通事故情况也呈现上升趋势[1]。在传统的交通事故分析方法中主要为现场的勘察,对事故的记录也仅仅局限于文字和图片信息,导致在分析事故的过程中缺乏全面性和直观性。同时工作人员还需要对现场进行完整的保护,因此为了保护现场往往会加重道路交通的拥堵状况,给车辆的行驶带来不便。针对这种问题,本文提出利用计算机动画技术结合三维引擎,对交通事故进行动态的三维重现,快速地再现车辆交通事故的全过程,这样不仅可以对交通事故进行形象化、直观化的记录,而且还可以快速地清除车辆事故现场,保持道路的顺畅。在本文中,通过对三维引擎OGRE(Object-Orient⁃ed Graphics Rendering Engine)分析并了解其动画原理,根据现场的实际情况,完成了对车辆交通事故过程的三维动态重现。
三维引擎OGRE是用C++语言开发面向场景的三维引擎,是一个成熟、稳定、可靠、灵活的三维平台,而且拥有丰富功能实时三维图形库。三维引擎OGRE是开源的,可以通过查看源码的方式来更好地了解其内部构造和工作原理,方便研究人员的开发和利用。
在OGRE中要重点了解场景管理器,场景管理器(SceneManager)是OGRE引擎中极其重要的组成概念[2]。所有场景图的具体执行过程都来自SceneMan⁃ager类。在场景管理器中为用户提供了场景节点Node,用于悬挂模型实体Entity。OGRE三维引擎中,模型实体必须绑定场景节点,这样才能在渲染窗口中被显示。同样场景中的地面、天空、摄像机以及灯光都需要与相应的场景节点所绑定才是实现效果。在OGRE中用attachObject()函数就可以实现场景节点的绑定[3]。
模型实体与场景节点绑定后,对场景节点进行旋转、缩放、平移的操作就相当于模型实体相应的操作。在进行车辆交通事故的三维动态仿真时,主要用到三维引擎OGRE中的场景节点动画以及关键帧动画。通过对场景节点的平移、旋转操作来设置不同的关键帧画面,OGRE会通过插值方式来计算关键帧画面之间的运动轨迹,设置完多个关键帧画面后,加载动画并以启动就可以实现场景节点动画,也就实现了模型实体的动画过程。
重现车辆的交通事故,首先要对道路模型的加载和显示。本文采取的方法为是通过创建地面,然后将纹理贴图贴在地面上,形成地面道路模型,不同的纹理贴图就形成了不同的地面道路模型。在这里,纹理贴图的像素越高,在OGRE渲染窗口显示的效果就越好。在OGRE中通过createPlane()函数创建地面,在创建地面时要说明地面的法线以及位置,同时还要设置好地面的大小,以及纹理贴图的次数为1次。
通过以上程序就在OGRE渲染界面中创建了一个大小为1500×1500,且垂直于Y轴的平面。创建完平面后要对该平面添加材质贴图,需设置一个材质脚本,通过编译设置材质脚本来实现平面的贴图过程。在材质脚本中,设置材质的名称为My Test Material,并为其添加纹理单元。
不同的纹理单元,加载显示的道路模型就不同。本文加载的为丁字马路的纹理单元,来构建丁字马路的模型。设置完材质脚本后,使用set Material Name()函数来为地面设置材质。
当然创建的平面也要与场景节点进行绑定。构建完马路的模型后,然后添加一些房屋和树木以及事故发生的车辆模型,这样整个交通事故现场的三维场景就初步搭建完毕。图1为设置加载地面模型,并加载了房屋和树木模型的事故现场三维图。
图1 交通事故现场的三维场景图
交通事故现场搭建完毕后,就需要设置关键帧画面,在关键帧画面中设置车辆模型所绑定场景节点的位置信息和旋转信息,通过设置多个关键帧画面来实现事故动态的全过程。
在OGRE三维引擎中实现场景节点动画首先要定义动画,利用create Animation()函数来设置动画的名称和时间长度,并用set Interpolation Mode()来说明关键帧动画之间的插值方式。本文采取的为IM_SPLINE样条插值,采用样条插值方式好处是可以使整个动画过程更协调。然后要定义一个动画轨迹,并用create No⁃deTrack()函数来指定这个轨迹是作用到哪个特点的场景节点。接下来的旋转、平移操作就是针对该节点。
随后要在动画时间内,定义动画轨迹所包含的关键帧。使用 set Translate()函数、set Rotation()函数来设置关键帧在每一个时间点上场景节点的位置和旋转信息。其中需要注意的是在使用set Rotation()函数来设置旋转信息时参数是为四元数,其次在某个关键帧画面中场景节点的旋转和平移信息没有变动,也要在该关键帧中设置节点的所有状态信息[5]。
一个动画轨迹只能设置和实现一个场景节点的动画,也就是说只能实现一个模型实体的动画。而实际中动态过程中并不仅仅为一个模型,所以要设置多个运动轨迹对应不同的场景节点,从而使动画过程中模型的多个化。设置完多个运动轨迹和动画后,需要对所设置动画的状态,启动所定义的动画,然后就完成了整个车辆交通事故动态过程的重现。
本文模拟了一辆大巴车和一辆小轿车相撞的交通事故。图2显示了两辆车的相撞前的起始帧画面。
图2 交通事故的起始帧画面
图3显示了车辆相撞瞬间以及相撞过程中的关键帧画面。
图3 车辆相撞过程的关键帧画面
图4 车辆相撞后的关键帧画面
图4显示了车辆相撞后的关键帧画面。
通过对整个动态过程的截取,显示了此次两辆车相撞的交通事故动态全过程,实现了在三维引擎OGRE中重现交通事故的动态全过程。
本文基于OGRE三维引擎,利用场景节点动画、关键帧动画等计算机动画技术,设计实现了道路模型的加载,通过设置关键帧画面中场景节点的位置和旋转状态信息,以及多个动画的设置,动态重现了道路中车辆相撞的交通事故。通过对交通事故的动态重现,解决了传统交通事故信息记录的单一性,使事故信息的记录更形象化、直观化,解决因保护现场而引发的交通拥堵状况,对实际的交通事故分析中起到帮助作用。
参考文献:
[1]崔海龙.基于Vega交通事故的3D场景仿真重现[J].电脑知识与技术,2014,10(30):7182-7185.
[2]李韧,李妮,龚光红.基于Ogre的三维仿真场景渲染关键技术研究[J].系统仿真学报,2017,29(S1):161-166+172.
[3]甘建伟,刘晶,张蒙蒙,吕戌杪.OGRE中Mesh模型加载方法的研究与实现[J].科技经济导刊,2018(01):3-6.
[4]张辉.交通事故三维动画模拟系统的研究与实现[D].南京理工大学,2005.
[5]Gregory Junker.ProOGRE 3D Programming[M].New York:Apress,2006:171-189,37-51.