王彩玲 劉瑞香 宋 釗
(西安石油大學(xué)計算機學(xué)院,陜西 西安 710065)
目前,虛擬現(xiàn)實技術(shù)已經(jīng)成為計算機技術(shù)中研究,開發(fā)和應(yīng)用的熱點,廣泛的應(yīng)用于教育[1-2]、醫(yī)療[3]、建筑、工業(yè)設(shè)計[4-5]、產(chǎn)品展示等各個領(lǐng)域。虛擬校園社區(qū)實現(xiàn)了對校園三維景觀和教學(xué)環(huán)境的數(shù)字化和虛擬化。將學(xué)校風(fēng)光用虛擬仿真實現(xiàn),既可以為學(xué)校樹立良好的形象,讓來訪者足不出戶就可以身歷其境的感受到真實的校園實景和有關(guān)介紹信息;還可以作為校園規(guī)劃的輔助工具,提高校園管理的現(xiàn)代化水平[6-7]。
虛擬校園社區(qū)可以提供三維虛擬環(huán)境,用于支持對現(xiàn)實大學(xué)的資源管理、環(huán)境規(guī)劃、學(xué)校發(fā)展和遠(yuǎn)程訪問等。是校園景觀和教學(xué)環(huán)境在計算機中的虛擬再現(xiàn)。它利用地理信息技術(shù)、虛擬現(xiàn)實技術(shù)、計算機網(wǎng)絡(luò)技術(shù)等高新技術(shù),實現(xiàn)對真實校園環(huán)境中的三維景觀和教學(xué)環(huán)境的數(shù)字化和虛擬化。到那時,世界各地的人們不必親臨現(xiàn)場,只需在網(wǎng)上就能暢游其間,方便人們隨時隨地了解校園的情況。
虛擬校園為師生們提供了非常便利和快捷的交流,同時完善的虛擬校園系統(tǒng)集學(xué)習(xí)、工作、娛樂、生活為一體,增加了師生之間交流的趣味性,有利于師生之間的良好溝通。虛擬校園社區(qū)以網(wǎng)絡(luò)為基礎(chǔ),利用先進的信息化手段和先進的計算機技術(shù)、網(wǎng)絡(luò)技術(shù)、虛擬現(xiàn)實技術(shù),實現(xiàn)學(xué)校與教學(xué)、科研、管理和生活服務(wù)有關(guān)的所有信息資源進行全面的數(shù)字化。把學(xué)校建設(shè)成面向校內(nèi)外,也面向社會的一個超越時間、超越空間的虛擬校園社區(qū),提高傳統(tǒng)校園的效率,擴展傳統(tǒng)校園的功能。最終實現(xiàn)教育過程的全面信息化,從而達(dá)到提高教育管理水平的目的。虛擬校園技術(shù)必將成為今后校園信息化發(fā)展方向的主流,而基于網(wǎng)絡(luò)的大規(guī)模虛擬校園漫游將成為研究的新熱點.本系統(tǒng)以unity3d作為開發(fā)平臺,結(jié)合AUTOCAD規(guī)劃總平面圖[8];利用AutoCAD、3DMAX、Photoshop、Unity3D等軟件實現(xiàn)了某高校虛擬校園設(shè)計,該虛擬校園場景具有良好的沉浸感,通過網(wǎng)上發(fā)布,測試了其流暢性,可以作為該學(xué)校的數(shù)字解說平臺使用。
虛擬校園的設(shè)計總體框架如圖1所示。
如圖1所示,首先,基于通過測量、觀察、相機記錄等方式獲取校園地理信息數(shù)據(jù)。包括校園建筑平面圖AutoCAD和校園建筑鳥瞰圖[9-10],以及花草、樹木、道路的具體數(shù)據(jù)及信息。
然后,使用3d建模軟件例如maya 3dmax等專業(yè)建模軟件,制作三維數(shù)字模型。本系統(tǒng)使用的是最為流行的3dmax對校園建筑模型進行加工和渲染。從而得到更加真實的三維立體模型。
第三步,在Unity3D中添加地面。將上述步驟建好的三維建筑模型根據(jù)地理坐標(biāo)依次添加到Unity3D中,進行場景融合。以及紋理添加、燈光渲染等工作[11-13]。
第四步,通過unity3D的跨平臺性,生成可以通過網(wǎng)頁瀏覽的Web格式的虛擬社區(qū)[14]。
Unity3d中的地形建立:
在Unity3D軟件中通過Terrain菜單建立及修改地形。Terrain地形編輯工具可以根據(jù)具體的實地場景進行隨意設(shè)置及修改。采用標(biāo)準(zhǔn)統(tǒng)一的地形,可以完成山地、城市和鄉(xiāng)村場景的設(shè)計,具有友好的界面。同時,可以在整個地形上鋪設(shè)地形紋理來裝飾地圖風(fēng)景,還可以混合或合并地形紋理來平滑地過渡一個地圖到另一個地圖,或使地圖的環(huán)境多樣化。這極大方便了虛擬場景的制作。
Unity3D軟件只支持fbx格式的三維模型,因此,在設(shè)計時,采用3DMax建模,將模型存儲為fbx類型。在Unity3D中的asset文件夾中添加Object文件夾,此時,Unity3D將自動識別該模型,并將其Material和 Textures分離出來導(dǎo)入到Object的文件夾下面。此時,當(dāng)模型導(dǎo)入時,我們可以在菜單欄Assetsimport new asset,選擇我們要導(dǎo)入的 *.fbx[15]。
在Unity3d環(huán)境中設(shè)計紋理及貼圖之前應(yīng)先確定各模型的材質(zhì)、貼圖和物理屬性。在獲取相關(guān)屬性后,將模型導(dǎo)入Unity3d中進行Shader腳本設(shè)置和紋理貼圖。Unity3D中的shader腳本,采用shaderlab腳本語言編寫,shader的框架如下:
shader"shader name"
{ properties
{ _Color("Diffuse Color",Color)=(1,.5,.5,1)_Texture("Main Texture",2D)=""{}
}
SubShader
{
Tags{"Queue"="Transparent"}
pass
{
Tags{}
Material{}
}
}
Fallback""
}
其中,properties中定義的變量,是可以采用編輯器編輯的。在Unity3D編輯器中選中一個材質(zhì),材質(zhì)中的shader里面定義在properties中的變量就會出現(xiàn)該材質(zhì)的屬性面板中,可以手動設(shè)置對應(yīng)的屬性。其中,紋理屬性后面,還有一些可選的屬性可以設(shè)置,用于設(shè)置紋理的坐標(biāo),和其他一些屬性。
在進行模型設(shè)計后,需要將多個模型及場景依據(jù)平面圖進行場景整合,還需要背景配樂等多媒體文件支持。在設(shè)計時,通過建立Directional Light和sky box,可以使場景更加明亮和逼真。
在虛擬漫游中,我們希望通過控制鼠標(biāo)或者鍵盤實現(xiàn)視角和場景的轉(zhuǎn)換。在具體實現(xiàn)中,首先,在3DMax建模軟件中分別制作人物的行走動畫、站立動畫、跳躍動畫和跑步動畫,制作完畢后,將動畫模型保存為.fbx文件格式。將動作模型導(dǎo)入到Unity3D項目的Object文件夾中。然后,在欄中選中導(dǎo)入動畫模型,在屬性面板中設(shè)置模型不同動作的開始和結(jié)束幀,所拖拽動畫模型到舞臺中去。
通過Character Moto命令給動畫模型添加人物控制器,在屬性面板中調(diào)節(jié)Radius和Height來調(diào)節(jié)人物控制器的輪廓、高度。在軟件中添加Javescript控制代碼實現(xiàn)運動控制。具體的,設(shè)計鼠標(biāo)控制需要對人物添加Mouse Look旋轉(zhuǎn)控制器,設(shè)計鍵盤控制需要對人物添加FPS Input Controller移動控制器。對相應(yīng)控制器設(shè)計即可實現(xiàn)視角隨著鼠標(biāo)方向的旋轉(zhuǎn)和鍵盤控制人物實現(xiàn)前后左右的移動[16-17]。
在具體設(shè)計時,需要考慮當(dāng)角色移動時,需要配合相應(yīng)的動作來完成角色移動的效果,比如:跑動作、跳動作等,為了給用戶帶來視覺的更加逼真的效果,在設(shè)計時,在animatioController.js添加動作代碼,其中核心代碼如下:
if(Input.GetAxis("Vertical")> .1)//如果是豎直方向的向前運動
{
if(Input.GetButton("Run"))//按下 run 按鈕
{
animation.CrossFade("run");//播放 run 動畫
walkSpeed=4;//同時設(shè)置速度為4
}
else
{
animation["walk"].speed=1;//其他時候則為走路
animation.CrossFade("walk");//播放走路動畫
walkSpeed=1;//同時設(shè)置速度為1
}
if(Input.GetAxis("Vertical")< -.1)////如果是豎直方向的向后運動
{
animation["walk"].speed=-1;//速度設(shè)置為負(fù)值
animation.CrossFade("walk");//播放走畫面
walkSpeed=1;
}
else
{
animation.CrossFade("idle");//其他時候為站立動畫
}
if(Input.GetI}eyDown ("space"))//當(dāng)空格鍵被按下就執(zhí)行跳躍動畫。
animation.CrossFade(”jump");
}
水平方向的控制和垂直方向運動相同代碼在此省略。
碰撞檢測[19]是模擬現(xiàn)實環(huán)境中的人物及物體在遇到障礙物時發(fā)生的本能反應(yīng),例如,當(dāng)角色遇到墻壁,如果沒有設(shè)計碰撞檢測,則角色會出現(xiàn)穿墻而過的失真現(xiàn)象,在現(xiàn)實中,應(yīng)該是當(dāng)發(fā)現(xiàn)墻壁與角色存在一定距離時,則需要停止前進。在這種情況下,設(shè)計人員需要添加碰撞檢測函數(shù)。在Unity3d軟件中提供了Mesh Collider撞檢測組件,該組件可以有效計算模型表面的網(wǎng)格自動生成碰撞面,但是如果模型表面的網(wǎng)格較多會影響執(zhí)行效率,通過給網(wǎng)格較多的模型添加一個基本體作為該模型的父模型,設(shè)置成不可渲染則可以有效解決該問題。
當(dāng)用戶漫游在數(shù)字校園中,如果只包含靜態(tài)的建筑,而缺乏了動態(tài)的人物交互,這樣的設(shè)計缺乏真實的體驗,在本系統(tǒng)中,采用C/S客戶端服務(wù)器模型,實現(xiàn)場景中的人物互動。其中,服務(wù)器相對獨立,可支持多個客戶端的訪問。兩者之間交互的原理為:客戶端向服務(wù)器發(fā)送請求,服務(wù)器給予反饋。當(dāng)訪問者按下移動按鍵時,客戶端將事件發(fā)送至服務(wù)器,服務(wù)器端判斷角色該如何移動才能將事件返回給客戶端,當(dāng)客戶端接受到服務(wù)器返回的數(shù)據(jù)后,開始移動角色,同時服務(wù)器端還會將其他訪問者的移動事件發(fā)送給客戶端。這樣客戶端就可以顯示其他訪問者的模型位置了。
具體設(shè)計時,服務(wù)器默認(rèn)開啟,服務(wù)器端核心代碼:
Void OnGUI(){
Switch(Network.PeerType){
Case NetworkPeerType.Disconnected:
StartServer();
Case NetworkPeerType.Server:
Break;
Case NetworkPeerType.Client:
Break;
Case NetworkPeerType.Connecting
Break;
}
}
Void StartServer()
{
if(GUILayout.Button("創(chuàng)建服務(wù)器”))
{
//服務(wù)端創(chuàng)建服務(wù)器
NetworkConnectionError error=Network.Connect(IP,Port,false);
//如果連接失敗,將錯誤信息打印出來
Debug.Log("連接狀態(tài):"+error);
}
客戶端核心代碼為:
Void OnGUI(){
Switch(Network.PeerType){
Case NetworkPeerType.Disconnected:
StartConnect();
Case NetworkPeerType.Server:
Break;
Case NetworkPeerType.Client:
Break;
Case NetworkPeerType.Connecting
Break;
}
}
Void StartConnect()
{
if(GUILayout.Button("連接服務(wù)器”))
{
//客戶端連接服務(wù)器
NetworkConnectionError error=Network.Connect(IP,Port);
//如果連接失敗,將錯誤信息打印出來
Debug.Log("連接狀態(tài):"+error);
}
服務(wù)器創(chuàng)建完成后,客戶端需要向服務(wù)服務(wù)器發(fā)送消息請求,并且確保服務(wù)器能夠?qū)碜阅骋豢蛻舳说恼埱笙⒎祷亟o連接到服務(wù)器的所有客戶端。需要首先創(chuàng)建一個網(wǎng)絡(luò)視圖組件,然后就可以使用RPC向服務(wù)器發(fā)送消息了。使用RPC發(fā)送消息的方法如下:
networkView.RPC("RequestMessage",RPCMode.All,inputMessage);
在服務(wù)器端或客戶端中接收消息請求的方法如下:
void RequestMessage(string message,NetworkMessageInfo info)
{
//message:消息內(nèi)容
//info:消息附帶信息
}
模擬效果如下:
任何系統(tǒng)都需要進行黑盒子測試以發(fā)現(xiàn)系統(tǒng)存在的問題和漏洞。本系統(tǒng)也進行了相應(yīng)的測試。在測試中發(fā)現(xiàn),基于網(wǎng)絡(luò)環(huán)境下,系統(tǒng)存在占用網(wǎng)絡(luò)流量大,運行緩慢的現(xiàn)象。分析原因是因為測試電腦配置較低及網(wǎng)絡(luò)帶寬限制。這就要求我們從用戶角度出發(fā),在保證真實度的情況下盡量減少模型的數(shù)量,大部分建筑需要通過平面建模來優(yōu)化模型的復(fù)雜度,在建模過程中盡量減少模型頂點和分段數(shù),在unity3d處理過程中,盡量使用靜態(tài)燈光,動態(tài)實時燈光相比靜態(tài)燈光,非常耗費資源。所以除了能動的角色和物體靜態(tài)的地形和建筑。盡量減少視角范圍和距離,減少不必要的運行消耗。
本系統(tǒng)通過Unity3D平臺建立了一個虛擬系統(tǒng),并通過C/S模式構(gòu)建人物交互,采用HTML格式發(fā)布,幾乎適應(yīng)所有平臺瀏覽。實現(xiàn)效果逼真仿真度高,系統(tǒng)運行穩(wěn)定可靠性好,系統(tǒng)與用戶交互性好,能夠非常直觀地帶給用戶身臨其境的場景漫游效果,漫游過程場景切換順暢,而且可以為場景提供豐富的多媒體影音交互。
Unity3D提供可視化的界面操作,地形制作和文理添加,以及擁有“對象碰撞檢測”、“角色漫游”功能,方便了系統(tǒng)的開發(fā)?;赨nity3D的虛擬漫游技術(shù)原理與渲染效果非常適合虛擬校園漫游的設(shè)計,隨著以后越來越多的漫游系統(tǒng)的需求,Unity3D引擎技術(shù)將會被更為廣泛的應(yīng)用。
[1]范立冬,李曙光,張治剛.虛擬現(xiàn)實技術(shù)在醫(yī)學(xué)訓(xùn)練中的應(yīng)用[J].創(chuàng)傷外科雜志,2008,12(9).
[2]吳燕玲.基于Wed的玩味動畫技術(shù)及其在教學(xué)中的應(yīng)用[J].中山大學(xué)學(xué)報:自然科學(xué)版.2002,12(6):53-56.
[3]詹勝利.Web3D技術(shù)在網(wǎng)絡(luò)教學(xué)中的應(yīng)用[J].網(wǎng)絡(luò)技術(shù)與網(wǎng)絡(luò)教學(xué),2006.1:15-17.
[4]來翔.面向電子商務(wù)的虛擬商品模型研究[J].浙江大學(xué),2003.
[5]沈璞.虛擬現(xiàn)實技術(shù)在現(xiàn)代工業(yè)設(shè)計中的應(yīng)用[J].制造業(yè)自動化,2004.11(6):76-78.
[6]張典華,陳一民.基于Unity3D的多平臺虛擬校園設(shè)計與實現(xiàn)[J].計算機技術(shù)與發(fā)展,2013,24(2):127,135.
[7]馬瑞.基于Unity3D的多平臺三維虛擬數(shù)字校園的設(shè)計與實現(xiàn)[J].蚌埠學(xué)院學(xué)報,2014,3(2):13-16.
[8]Okabe M,Igarashi T.3D modeling of trees from freehand sketches[C]//International Conference on Computer Graphics and Interactive Techniques.ACM SIGGRAPH 2003 Sketches&Applications.New York,USA:ACM,2003:1-1.
[9]Okabe M,Owada S,Igarashi T.Interactive design of botanical trees using freehand sketches and example-based editing [J].Computer Graphics Forum,Eurographics(S0167-7055),2005,24(3):487-496.
[10]Livny Y,Yan F L,Olson M,et al.Automatic Reconstruction of Tree Skeletal Structures from Point Clouds [J].ACM Transactions on Graphics (S0730-0301),2010,29(6):151-1:151-8.
[11]周希望,劉正東.虛擬校園的建模優(yōu)化及Web3D交互技術(shù)[J].軟件導(dǎo)刊,2010,9(1).
[12]付林.永豐大廈虛擬漫游數(shù)字平臺的設(shè)計與實現(xiàn)[D].北京交通大學(xué),2010(1).
[13]倪樂波,戚鵬.Unity 3D產(chǎn)品虛擬展示技術(shù)的研究與應(yīng)用[J].數(shù)字技術(shù)與應(yīng)用,2010(9).
[14]郭海新.Unity 3D與HTML交互機理的研究[J].煤炭技術(shù),2012(9).
[15]毛天露,王兆其.個性化三維人體模型快速建模方法[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2005,17(10):2191-2195.
[16]干建松.基于Unity 3d的室內(nèi)漫游的關(guān)鍵技術(shù)研究[J].鹽城工學(xué)院學(xué)報:自然科學(xué)版,2011(20).
[17]何志毅,田金萍,李天松,等.虛擬人行走的動作融合[J].計算機工程,2009,35(22):267-271.
[18]甘建紅,彭強,戴培東,等.基于 OBB層次結(jié)構(gòu)碰撞檢測的改進算法[J].系統(tǒng)仿真學(xué)報,2011,23(1):2619-2173.
[19]Gayle R,Manocha D.Navigating virtual agents in online virtual worlds[C]//Proceedings of the Web3D 2008.New York,NY,USA:ACM,2008:53-56.