黃俊杰,金沐祥,秦亞光,彭 迪
(武漢紡織大學,湖北 武漢 430200)
近年來,隨著計算機軟硬件技術以及虛擬現實技術的不斷發(fā)展,其研究和應用也愈發(fā)成熟。目前虛擬現實技術已經被廣泛應用在各個領域,其中就包括體育領域。20世紀初Paul Hawkins等人基于虛擬現實技術發(fā)明了一套鷹眼系統,該系統在設計之初是為了幫助賽場裁判對邊界球、爭議球做出判罰。當前國內外相關學者對鷹眼技術進行了積極探索,但是仍存在商業(yè)化成本高,應用場景受限以及用戶體驗不佳等問題。
文中基于Unity3D平臺設計和實現了一套應用于網球賽事中的鷹眼三維可視化系統,該系統實現成本相對低廉,除了能夠用于輔助賽場裁判對邊界球做出判罰和分析球員的擊球方式和策略,還能提供用戶和虛擬場景中的對象之間的交互功能,提升了用戶體驗。此外,結合當下快速發(fā)展的WebGL技術,上傳系統的Unity網頁版文件到服務器,部署網絡云平臺,讓系統的應用場景不再受硬件設備、場地環(huán)境的限制。
鷹眼三維可視化系統的主要設計步驟如下:
(1)在場地周圍布置多架高速攝像機采集網球運動的二維圖像數據,然后運用基于NTP同步協議的方式[1]實現多目攝像機幀同步,再通過邊緣檢測和哈夫變換處理得到網球球心的二維坐標[1-4],最后利用OpenCV相關方法還原演算得到網球在真實場地中的空間三維坐標,并存入數據庫;
(2)根據網球場地拍攝的圖片和已知的資料利用3D Max進行網球場地建模,利用photoshop制作紋理貼圖,然后將已經制作完成的模型從3D Max中以FBX的格式導入到Unity3D工程中;
(3)在Unity3D中完成相關的場景搭建和圖形用戶界面GUI的制作,利用Visual Studio編輯C#交互式腳本;
(4)系統發(fā)布。
系統開發(fā)具體流程如圖1所示。
圖1 鷹眼三維可視化系統開發(fā)流程
網球場地的三維建模是整個系統的基礎,利用3D Max進行場地建模的主要方法有基礎建模法、多邊形建模法、修改器建模法、復合對象建模法等[5]。為使場地模型達到更加逼真的效果,采用多邊形建模法再配合其他建模法進行搭建,并利用光照烘焙和紋理貼圖設置材質和渲染輸出。網球場地三維模型如圖2所示。
圖2 網球場地三維模型
通過多目高速攝像機獲取網球運動的二維圖像,由于軟硬件原因,無法保證數據接收端在同一時刻接收到的不同攝像機的數據是同一時刻不同角度網球的照片,目前解決這一問題的方法主要分為以下幾種:(1)硬件幀同步,通過同步控制觸發(fā)器來觸發(fā)多個攝像頭同時啟動拍攝。(2)基于PLL鎖相環(huán)的方式[6-7],該方法利用相位同步電壓實現目攝像機幀同步。(3)基于NTP同步協議的方式[8],該方法通過計算各個數據發(fā)送端發(fā)送數據到服務器需要等待的時間,來確定攝像機之間的時間差,再根據相應的時間差確定同一時刻網球運動圖像的幀組。其中硬件幀同步對設備要求高,無法普及;而基于PLL鎖相環(huán)的方式,需要調節(jié)和控制攝像機的增益參數,以及LED燈光照,操作較為復雜。文中通過設置同步信號發(fā)生器,并使各分站相機之間的線徑相同,同時給每一幀圖片加上一個標記位,當幀數達到50時,攝像機停止工作,待信號發(fā)生器再次發(fā)送脈沖信號時,同步啟動拍攝。其基本原理如下:
采用的高速攝像機最高可以以2 000 fps的速度拍攝網球運動圖像,設置同步信號發(fā)生的時間間隔為50 ms,攝像機接收到同步脈沖信號時啟動拍攝50幀圖像,將所有攝像接收到該次同步信號啟動拍攝的50幀作為一組同步圖像,依次類推。每間隔50 ms做一次校正,有效減少幀同步誤差。
圖3中T1代表同步信號發(fā)生器首次產生脈沖信號在時間軸上的值,T2代表攝像機啟動拍攝時在時間軸上的值,T3代表同步信號發(fā)生器再次產生脈沖信號時在時間軸上的值,T4代表攝像機第二次收到同步信號并啟動拍攝時在時間軸上的值。
圖3 同步信號發(fā)生器工作原理
系統要能夠在協助裁判在邊界球等疑難狀況下做出準確判罰,并實時地通過該系統再現比賽畫面,其中很重要的一步就是快速準確地獲取運動網球的三維坐標。首先對得到的網球運動二維圖像數據進行邊緣檢測,再利用哈夫變換基本原理求取網球成像圓心的二維坐標值,最后基于兩部相機之間的成像關系原理由網球成像二維圓心坐標解算得到網球的空間三維坐標值。其基本原理和實現方法如下:首先通過相機標定技術得到相機的畸變系數、世界坐標值、焦距等相關信息,然后對選取兩幅同步圖像進行特征提取特征匹配,最后利用兩部相機之間的成像關系,調用OpenCV庫中的相關函數還原網球的三維空間坐標值。其中,特征提取是通過計算機圖像處理技術提取圖像中的信息,并由此確定這些信息當中能唯一標定一個圖像特征的特征值;特征匹配簡單來說就是確定通過世界坐標系中的物體在兩幅圖像中的投影點之間的相互聯系,根據它們之間的相互關系確定該點在三維空間中的坐標;利用OpenCV還原網球真實的空間三維坐標的主要步驟是:
(1)利用函數find Fundamental Mat()求取二維圖像的基礎矩陣F,然后將基礎矩陣代入函數Compute Correspond Epilines()中,利用極線約束原理在兩幅圖像中確定相互對應的極線,并在極線上搜索唯一對應的點,由此確定其坐標值。
(2)根據以上配對完成的點坐標值以及相機參數基礎矩陣,通過find Essential Mat()得到本征矩陣E,再進行SVD分解,最后得到旋轉矩陣R、平移向量t和兩幅圖像的投影矩陣P1、P2,再根據相機成像基本原理計算網球的空間三維坐標。
實際情況下,網球空間三維坐標的分布并不完全在一條空間曲線上,需要對網球運動軌跡曲線進行空間曲線擬合運算。系統基于投影法和最小二乘法[9-10]進行曲線擬合,基本思想是先將三維問題轉為二維平面問題,即首先將求得的網球空間坐標向xoy平面投影得到相應投影坐標,然后再對這些平面上的二維坐標進行曲線擬合,得到的最優(yōu)解對應的網球空間三維坐標,最后將擬合完成的網球空間三維坐標存入數據庫。解算網球空間三維坐標的流程示意圖如圖4所示。
圖4 網球空間三維坐標計算流程示意圖
鷹眼三維可視化系統第一人稱視角漫游,可用于制作場地渲染動畫,提升觀賞度等。在虛擬網球場地中通過鼠標移動來控制第一人稱的轉向,利用鍵盤上的按鍵進行前后左右的移動。具體實現如下:
通過Unity3D引擎提供的GameObject創(chuàng)建Empty空物體,命名為Perspecive,把標簽Tag改為Perspecive,點擊Component組件,依次選擇Physics->Character Controller,添加剛體(Rigibody)組件,讓創(chuàng)建的物體具有物理特性。再勾選is Kinematic讓對象不再受物理引擎的控制,使其只能通過Transform屬性來操控。部分核心代碼如下:
VoidMouseControl()
{
float th =Input.GetAxis(“Mouse X”); //鼠標水平方向上的移動單位數
float tv =Input.GetAxis(“Mouse Y”); //鼠標垂直方向上的移動單位數
t_cameraR.x-=tv;
t_cameraR.y+=th;
m_camTransform=t_cameraR; //根據鼠標移動距離旋轉第一人稱攝像機
系統通過在Canvas對象上放置控件,并掛載相應功能的腳本組件,使其能根據用戶的選擇動態(tài)調整觀賽視角、改變場地背景貼圖以及回放功能,實現系統和用戶之間的交互[11]。
通過Unity3D引擎提供的GameObject功能創(chuàng)建八個Camera對象,并將它們置于場景的適當位置,使其對應于場地中各個攝像機對象,以此來渲染不同的視角,然后通過掛載C#腳本實現不同視角之間的切換。多視角展示效果如圖5所示。
圖5 多視角展示
4.3.1 設置碰撞檢測
在本系統中,由于網球會與地面和周圍場景產生碰撞,為了使場景還原更加逼真,通過設置環(huán)境碰撞檢測來模擬網球落地以后和周圍場景產生碰撞的場景。實現方法如下:
(1)通過選擇Component->Physics->Rigidbody給網球添加剛體。然后右擊Project,依次選擇Import Package->Physic Matarials設置剛體屬性。上述步驟完成以后把材質拖入到Hierachy窗口的組件中。
(2)通過添加腳本進行監(jiān)聽。依次選擇Assets->Create->Script創(chuàng)建腳本:
Function t_OnCollision (t_obj:Collision)
{
Debug.Log(“Collide:”+obj.collider.name+”t_gameObject.name”);
}
其中函數t_OnCollision是在被綁定的物體發(fā)生碰撞時調用。t_Obj為被撞物體的參數,Collision為類型,t_gameobject為網球。最后將腳本文件綁定到空物體上即可。
4.3.2 獲取網球運動數據與可視化
通過C#腳本組件連接數據庫,獲取由上文方法計算得到的網球空間三維坐標,將這些坐標數據實時傳遞給虛擬場景的網球對象,最后還原網球真實的運動場景。還原的網球運動場景如圖6所示。其具體實現步驟如下:
圖6 網球運動場景
(1)在制作好的網球對象上添加C#腳本組件,設置數據庫所在的IP地址和開啟的端口,創(chuàng)建連接套接字與數據庫建立連接,獲取網球三維坐標數據。部分核心代碼如下:
string ConnectStr="server=(服務器地址);port=(服務器開啟的端口);database=world;user=root;password=******;SslMode = none;"
MySqlConnection conn=new MySqlConnection(connet Str);
MySqlCommand cmd=new MySqlCommand("select * from city", conn);
MySqlDataReader reader=null;
conn.Open(); //打開通道,建立連接
//執(zhí)行查詢,并將結果返回給讀取器
reader=cmd.ExecuteReader();
while (reader.Read())
{
print("ID=" + reader[0].ToString() + " ,TITLE=" + reader[1].ToString() + " ,KEYWORD=" +
reader[2].ToString() + " ,CONTENT=" + reader[3].ToString() + ".");
}
(2)在Void Update()函數體中將獲取的坐標數據傳遞給transform.localPosition,從而改變每一幀網球對象的位置,還原出網球運動場景。部分核心代碼如下:
void Update () {
transform.localPosition = Vector3.MoveTowards(tra nsform.localPosition, new Vector3(arr[i][4], arr[i][3], 0),speed * Time.deltaTime);
//實時改變網球的位置
}
隨著計算機通信技術的不斷發(fā)展進步,各類云平臺應用程序已經成為一種新興的信息服務模式。本系統通過部署網絡云平臺,讓用戶可以通過安裝有瀏覽器的PC端、手機端等來訪問Web服務器在線觀看比賽[12]??紤]到比賽數據的安全性,將服務器部署在防火墻之后,并以分布式的方式部署在線服務系統,確保訪問請求時的用戶體驗和服務器的穩(wěn)定性。后端數據庫服務器的部署,可以根據實際需求靈活布置,當系統被用于教練及運動員內部討論分析比賽策略時,可部署在局域網內,既降低了服務器和數據的更新維護成本,又保障了比賽數據的安全性。當用戶規(guī)模較大時,可以部署在云服務器上,這樣可以根據用戶數量動態(tài)拓展服務器的規(guī)模。其網絡系統架構如圖7所示。
圖7 網絡云平臺部署結構
(1)轉換模型的格式:將建立的模型導出為FBX或Unity3D支持的格式模型;
(2)模型輕量化:將模型導入Unity3D引擎,給模型添加相應的材質,并對模型進行輕量化處理,以確保其在網絡云平臺上運行順暢;
(3)利用Revit建立結構化數據庫;
(4)功能模塊:在Unity3D引擎中編寫功能模塊和在本地部署的功能模塊一致;
(5)數據交互模塊:數據交互模塊主要使用Json實現數據庫、網頁、Unity3D之間數據的提取、傳輸和保存;
(6)跨平臺開發(fā):將程序發(fā)布到WebGL;如果需要還可以將程序發(fā)布到其他操作系統上,目前Unity3D支持的操作系統如圖8所示。
圖8 Unity3D支持的發(fā)布平臺
5.3.1 模型輕量化處理的基本原理
基于B/S模式搭建網絡云平臺,為了獲得更好的用戶體驗,三維模型往往涉及到大量的細節(jié)紋理等,這就導致了模型文件相較于目前的網絡而言還過于臃腫。為了解決這一問題,要求在保證用戶體驗的同時需要盡可能地減少需要的傳輸數據量。而對于減少數據傳輸量很重要的一步就是使用輕量化模型,但傳統的輕量化模型會降低模型材質、文本、紋理等信息的質量。系統通過平面擬合輕量化模型,在保證模型質量不影響觀賞體驗的前提下實現模型的輕量化,其基本步驟如下:
(1)遍歷構建模型的三角形,求出它們的法向量,根據這些法向量之間的夾角設定一個合適的閾值角度;
(2)將在法向量之間的角度小于預設閾值角度的三角形歸為一組;
(3)計算第二步中的三角形頂點的空間坐標,并判斷該組是否存在相同的頂點空間坐標,若存在則再將其歸為相鄰組,依次下去以三角形最少的一組作為基礎多邊形組。
該方法的重點是根據物體的外形規(guī)則選擇合適的擬合角度作多邊形,這樣就能達到整個平面的相對最小化,從而實現模型數據小型化的目的。
5.3.2 模型輕量化具體實現
針對模型輕量化的算法有很多種,而模型輕量化也是有針對性的,即一些特殊的模型設計了針對模型輕量化的特殊算法。這里的云平臺架構設計和功能研發(fā)主要基于Unity3D,所以輕量級模型也是在Unity3D引擎環(huán)境下實現的。Unity3D在其Asset Store中推出了MeshSimplify插件,在一定程度上實現了模型的輕量化。MeshSimplify插件包含各種輕量級算法,其核心算法也是基于上述平面擬合原理。它最顯著的特點是可以遍歷父對象下的所有子對象,分析每個子對象的組成,然后進行有針對性的輕量化處理。MeshSimplify插件是一個開源插件。如果有些算法不適合當前的模型,可以繼承源代碼類并修改它們,這樣就不會破壞源代碼,實現想要的新功能。通常在Unity3D中使用簡單的插件,只需將帶有插件的腳本MeshSimplify (Script)添加到需要輕量化的模型中。需要注意的是MeshSimplify (Script)腳本會將所有子對象進行輕量化,并將此腳本添加到空對象中。該腳本遍歷空對象的所有子集,并使所有對象子集輕量化。
構建網絡云平臺需要將經由上述步驟輕量化處理模型以后將其上傳至服務器數據庫。文中以SQLServer搭建服務器數據庫:
(1)在SQLServer數據中創(chuàng)建一個名為Tennis_database的數據庫;
(2)打開Tennis_database以ODBC的方式建立數據庫連接;
(3)新建數據源,并設置相應的參數,在后續(xù)的管理上可以直接通過改數據源進行管理;
(4)安裝相應的數據源驅動;
(5)建立連接數據庫的ODBC數據源,可通過該數據源連接數據庫。
需要注意的是,將模型導入到SQLServer的過程中,每個模型都是作為一個單獨的文件創(chuàng)建,需要將模型的數據文件分開導入到SQLServer中。這里將所有模型鏈接到同一個模組里,這樣在通過url尋址相應的文件時相當于自動分層級,避免出現命名重復的問題。
本系統采用三維建模技術按照真實場景[13]和虛擬場景1∶1的比例搭建模擬場景,利用虛擬現實技術[14-15]細致、全面地描繪出了網球場地的三維場景。通過Unity3D平臺掛載C#腳本實現和用戶之間的交互。部署網絡云平臺降低了系統成本和拓展了應用場景。主要研究結論如下:
(1)基于Unity3D進行三維可視化系統的開發(fā)具有高度的可移植性,可兼容目前大多數主流平臺。
(2)Unity3D引擎對第三方平臺開發(fā)設計的模型具有良好兼容性,支持3DS Max、Google SketchUp、Maya等主流平臺開發(fā)設計的模型。
(3)Unity3D引擎的渲染組件功能強大,能夠生成較為逼真的場景效果,引擎提供豐富的二次開發(fā)的接口,具有良好的可擴展性和可移植性。
下一步主要工作是找出鷹眼三維可視化系統運行過程中用戶在使用各種功能時的交互體驗問題和系統性能問題,以便及時糾正和改進。同時,由于三維模型文件大于傳統圖形文件,不利于在中低端設備上運行,在采用B/S模式部署為網絡云平臺之后,還需要占用大量的網絡帶寬。為此,將繼續(xù)優(yōu)化系統的資源文件,以改善用戶體驗,降低硬件配置要求。