范世博,卜凡亮
(中國人民公安大學信息技術與網絡安全學院,北京 102623)
近年來,我國機動車的數(shù)量猛增,全國的大中小城市都面臨著不同程度的交通擁擠狀況,交通事故情況也呈現(xiàn)上升趨勢[1]。在傳統(tǒng)的交通事故分析方法中主要為現(xiàn)場的勘察,對事故的記錄也僅僅局限于文字和圖片信息,導致在分析事故的過程中缺乏全面性和直觀性。同時工作人員還需要對現(xiàn)場進行完整的保護,因此為了保護現(xiàn)場往往會加重道路交通的擁堵狀況,給車輛的行駛帶來不便。針對這種問題,本文提出利用計算機動畫技術結合三維引擎,對交通事故進行動態(tài)的三維重現(xiàn),快速地再現(xiàn)車輛交通事故的全過程,這樣不僅可以對交通事故進行形象化、直觀化的記錄,而且還可以快速地清除車輛事故現(xiàn)場,保持道路的順暢。在本文中,通過對三維引擎OGRE(Object-Orient?ed Graphics Rendering Engine)分析并了解其動畫原理,根據(jù)現(xiàn)場的實際情況,完成了對車輛交通事故過程的三維動態(tài)重現(xiàn)。
三維引擎OGRE是用C++語言開發(fā)面向場景的三維引擎,是一個成熟、穩(wěn)定、可靠、靈活的三維平臺,而且擁有豐富功能實時三維圖形庫。三維引擎OGRE是開源的,可以通過查看源碼的方式來更好地了解其內部構造和工作原理,方便研究人員的開發(fā)和利用。
在OGRE中要重點了解場景管理器,場景管理器(SceneManager)是OGRE引擎中極其重要的組成概念[2]。所有場景圖的具體執(zhí)行過程都來自SceneMan?ager類。在場景管理器中為用戶提供了場景節(jié)點Node,用于懸掛模型實體Entity。OGRE三維引擎中,模型實體必須綁定場景節(jié)點,這樣才能在渲染窗口中被顯示。同樣場景中的地面、天空、攝像機以及燈光都需要與相應的場景節(jié)點所綁定才是實現(xiàn)效果。在OGRE中用attachObject()函數(shù)就可以實現(xiàn)場景節(jié)點的綁定[3]。
模型實體與場景節(jié)點綁定后,對場景節(jié)點進行旋轉、縮放、平移的操作就相當于模型實體相應的操作。在進行車輛交通事故的三維動態(tài)仿真時,主要用到三維引擎OGRE中的場景節(jié)點動畫以及關鍵幀動畫。通過對場景節(jié)點的平移、旋轉操作來設置不同的關鍵幀畫面,OGRE會通過插值方式來計算關鍵幀畫面之間的運動軌跡,設置完多個關鍵幀畫面后,加載動畫并以啟動就可以實現(xiàn)場景節(jié)點動畫,也就實現(xiàn)了模型實體的動畫過程。
重現(xiàn)車輛的交通事故,首先要對道路模型的加載和顯示。本文采取的方法為是通過創(chuàng)建地面,然后將紋理貼圖貼在地面上,形成地面道路模型,不同的紋理貼圖就形成了不同的地面道路模型。在這里,紋理貼圖的像素越高,在OGRE渲染窗口顯示的效果就越好。在OGRE中通過createPlane()函數(shù)創(chuàng)建地面,在創(chuàng)建地面時要說明地面的法線以及位置,同時還要設置好地面的大小,以及紋理貼圖的次數(shù)為1次。
通過以上程序就在OGRE渲染界面中創(chuàng)建了一個大小為1500×1500,且垂直于Y軸的平面。創(chuàng)建完平面后要對該平面添加材質貼圖,需設置一個材質腳本,通過編譯設置材質腳本來實現(xiàn)平面的貼圖過程。在材質腳本中,設置材質的名稱為My Test Material,并為其添加紋理單元。
不同的紋理單元,加載顯示的道路模型就不同。本文加載的為丁字馬路的紋理單元,來構建丁字馬路的模型。設置完材質腳本后,使用set Material Name()函數(shù)來為地面設置材質。
當然創(chuàng)建的平面也要與場景節(jié)點進行綁定。構建完馬路的模型后,然后添加一些房屋和樹木以及事故發(fā)生的車輛模型,這樣整個交通事故現(xiàn)場的三維場景就初步搭建完畢。圖1為設置加載地面模型,并加載了房屋和樹木模型的事故現(xiàn)場三維圖。
圖1 交通事故現(xiàn)場的三維場景圖
交通事故現(xiàn)場搭建完畢后,就需要設置關鍵幀畫面,在關鍵幀畫面中設置車輛模型所綁定場景節(jié)點的位置信息和旋轉信息,通過設置多個關鍵幀畫面來實現(xiàn)事故動態(tài)的全過程。
在OGRE三維引擎中實現(xiàn)場景節(jié)點動畫首先要定義動畫,利用create Animation()函數(shù)來設置動畫的名稱和時間長度,并用set Interpolation Mode()來說明關鍵幀動畫之間的插值方式。本文采取的為IM_SPLINE樣條插值,采用樣條插值方式好處是可以使整個動畫過程更協(xié)調。然后要定義一個動畫軌跡,并用create No?deTrack()函數(shù)來指定這個軌跡是作用到哪個特點的場景節(jié)點。接下來的旋轉、平移操作就是針對該節(jié)點。
隨后要在動畫時間內,定義動畫軌跡所包含的關鍵幀。使用 set Translate()函數(shù)、set Rotation()函數(shù)來設置關鍵幀在每一個時間點上場景節(jié)點的位置和旋轉信息。其中需要注意的是在使用set Rotation()函數(shù)來設置旋轉信息時參數(shù)是為四元數(shù),其次在某個關鍵幀畫面中場景節(jié)點的旋轉和平移信息沒有變動,也要在該關鍵幀中設置節(jié)點的所有狀態(tài)信息[5]。
一個動畫軌跡只能設置和實現(xiàn)一個場景節(jié)點的動畫,也就是說只能實現(xiàn)一個模型實體的動畫。而實際中動態(tài)過程中并不僅僅為一個模型,所以要設置多個運動軌跡對應不同的場景節(jié)點,從而使動畫過程中模型的多個化。設置完多個運動軌跡和動畫后,需要對所設置動畫的狀態(tài),啟動所定義的動畫,然后就完成了整個車輛交通事故動態(tài)過程的重現(xiàn)。
本文模擬了一輛大巴車和一輛小轎車相撞的交通事故。圖2顯示了兩輛車的相撞前的起始幀畫面。
圖2 交通事故的起始幀畫面
圖3顯示了車輛相撞瞬間以及相撞過程中的關鍵幀畫面。
圖3 車輛相撞過程的關鍵幀畫面
圖4 車輛相撞后的關鍵幀畫面
圖4顯示了車輛相撞后的關鍵幀畫面。
通過對整個動態(tài)過程的截取,顯示了此次兩輛車相撞的交通事故動態(tài)全過程,實現(xiàn)了在三維引擎OGRE中重現(xiàn)交通事故的動態(tài)全過程。
本文基于OGRE三維引擎,利用場景節(jié)點動畫、關鍵幀動畫等計算機動畫技術,設計實現(xiàn)了道路模型的加載,通過設置關鍵幀畫面中場景節(jié)點的位置和旋轉狀態(tài)信息,以及多個動畫的設置,動態(tài)重現(xiàn)了道路中車輛相撞的交通事故。通過對交通事故的動態(tài)重現(xiàn),解決了傳統(tǒng)交通事故信息記錄的單一性,使事故信息的記錄更形象化、直觀化,解決因保護現(xiàn)場而引發(fā)的交通擁堵狀況,對實際的交通事故分析中起到幫助作用。
參考文獻:
[1]崔海龍.基于Vega交通事故的3D場景仿真重現(xiàn)[J].電腦知識與技術,2014,10(30):7182-7185.
[2]李韌,李妮,龔光紅.基于Ogre的三維仿真場景渲染關鍵技術研究[J].系統(tǒng)仿真學報,2017,29(S1):161-166+172.
[3]甘建偉,劉晶,張蒙蒙,呂戌杪.OGRE中Mesh模型加載方法的研究與實現(xiàn)[J].科技經濟導刊,2018(01):3-6.
[4]張輝.交通事故三維動畫模擬系統(tǒng)的研究與實現(xiàn)[D].南京理工大學,2005.
[5]Gregory Junker.ProOGRE 3D Programming[M].New York:Apress,2006:171-189,37-51.