


【摘 要】本文以廣西理工職業技術學院為例,論述三維虛擬校園建設和漫游的設計與實現,提出通過谷歌地球獲取校園整體地形地貌,采用Photoshop對實拍圖片進行處理,利用3DsMAX作為建模工具創建教學樓、辦公樓、宿舍、綜合樓等,運用Unity3D制作校園地形并實現第一人稱校園漫游的交互制作,其逼真的校園環境模擬和良好的交互性給用戶身臨其境的漫游體驗感。
【關鍵詞】虛擬校園 第一人稱虛擬漫游 3DSMAX Unity3D
【中圖分類號】G 【文獻標識碼】A
【文章編號】0450-9889(2018)06C-0187-04
近年來,虛擬現實技術發展迅猛,它作為一個體驗平臺和設計工具的共同體,通過計算機融合多源信息、交互式的三維動態視景和實體,創造出一個讓用戶“身處其中”的模擬環境,使用戶足不出戶就能獲得“身臨其境”的體驗感。三維虛擬校園漫游是通過對校園環境、建筑物、基礎設施等的仿真,以漫游的形式再現一個三維可視化的、有聲有色的虛擬校園,它基于虛擬現實技術,以真實校園為藍本,通過三維實景模擬的方式構建一個逼真的三維虛擬立體校園空間,實現了第一人稱的自主漫游,體現了環境的藝術性與真實性,使得學生和家長能夠提前了解校園教學和生活環境,提高學校的形象和聲譽,拓展了學校對外宣傳、招生、校容校貌展示水平,提升了學校文化建設的對外影響力和知名度,使得學校在日益激烈的高職生源競爭中脫穎而出。本文以廣西理工職業技術學院的三維虛擬校園漫游為例,通過3DsMAX進行建模和貼圖,使用Unity3D平臺制作校園地形,結合C#語言實現對三維虛擬校園第一人稱漫游的交互控制。
一、三維虛擬校園漫游開發流程與設計
(一)三維虛擬校園漫游開發流程。三維虛擬校園漫游的實現主要分為三大部分:數據采集、模型構建、第一人稱漫游制作。
1.數據采集。從谷歌地球獲取校園平面布局圖,為校園地形環境的制作、道路設置、建筑物布局提供依據;從學院后勤獲取各樓棟CAD設計圖,為校園建筑建模提供數據;拍攝校園中各建筑物細節圖,拍攝草坪、花圃、林地、天鵝湖、道路等校園環境景觀,現場測量門窗等獲取實景數據信息,為后期制作高仿真虛擬校園提供參考。
2.模型構建。包括模型創建、優化及紋理貼圖處理三個方面。導入處理好的CAD圖,使用3DMAX軟件創建校園各建筑物模型;刪除建筑物模型中的不可見面,對同一個面中多余的線和點進行移除,優化模型;使用Photoshop軟件裁剪圖片、處理貼圖和繪制建筑物紋理等;依據校園平面圖,使用Unity3D軟件制作校園地形、道路等。
3.第一人稱漫游制作。使用Unity3D軟件進行登錄界面設計、場景組建、碰撞設計、第一人稱設計、漫游設計、交互設計等。
具體流程如圖1所示。
(二)三維虛擬校園漫游設計。三維虛擬校園漫游的設計目標是使用戶在交互的過程中進行視覺、聽覺、觸覺的觸碰,足不出戶就能感受到濃烈的校園氣氛,獲得身臨其境的體驗。因此,我們將從以下幾個方面對三維虛擬校園漫游進行設計。
1.資源優化。為了避免場景過大而增加網絡環境和設備的負擔,本文所有建筑模型在主場景漫游時均以只顯示建筑物外觀的形式展現,并通過跳轉方式進入建筑物內部漫游,解決了主場景載入時負擔過大的問題,使得可以通過網絡訪問和瀏覽。
2.三維虛擬校園的展示。校園地形、建筑物等均以外觀95%相似度的精細模型展示,與真實校園環境基本吻合。
3.三維虛擬校園漫游。用戶可以通過鼠標、鍵盤在虛擬校園內自由游覽,并通過小地圖了解用戶在虛擬校園中的位置。
4.多媒體展示。用戶在進入建筑物內部巡游時,可通過點播視頻、音頻的方式了解該建筑物主要功能及相關宣傳資料,增強體驗感。
二、三維虛擬校園漫游的實現
(一)三維虛擬校園模型的構建。三維虛擬校園模型主要包括大門、教學樓、宿舍樓、運動場、路燈、花草樹木、人工湖、道路、地形模型等,可歸為建筑模型、環境模型、地表模型三大類。
建筑模型的構建,首先根據學院后勤處提供CAD圖在3DMAX中繪制建筑物二維圖形輪廓,再將其擠出、轉換為可編輯多邊形,然后對該可編輯多邊形進行擠出、倒角、橋、調整頂點等操作得到三維建筑物模型,最后對建筑物模型進行優化處理,通過減面、移除多余的邊和頂點、壓縮材質貼圖和對建筑物表面的細節如外墻瓷磚、門窗、裝飾物等以紋理貼圖代替等方法達到優化和減少模型所占內存空間的目的。
三維虛擬校園的環境模型中包含大量的花草樹木,為了減少場景所占內存空間,樹木均采用十字交叉面制作,花圃花卉采用立面體添加透明貼圖制作,草坪等植被則使用紋理映射的方法。
構建地表模型,需要將從谷歌地球上獲取的校園地形圖在CAD上進行處理,使用Unity3D的地形(Terrain)繪制高地、人工湖、山坡、平地、道路等,創建出廣西理工職業技術學院校園依山而建的地貌形態。
(二)場景構建。場景的構建包括登錄界面制作、模型載入、燈光設置、小地圖制作等。登錄界面以廣西理工職業技術學院正門照片作為背景,使用Unity3D軟件中UI的Text和Button制作標題和按鈕,如圖2所示。
主場景則是將所有在3DsMAX創建的模型導入到Unity3D系統中并擺放到相應的位置,調整大小和方向,在每個有宣傳展示功能的建筑物邊上設置進入建筑物的引導按鈕,使得能夠跳轉進入建筑物內部漫游和瀏覽。
為了使得場景看起來更逼真,需要為場景進行布光設置,使用Directional Light方向光充當太陽光,在需要的地方適當添加Point Light點光源以增強效果。設置主角外的所有模型為Static靜態模式,使用Lightmapping技術將光線效果預渲染成為貼圖模擬物體上的光影效果,減少光影對性能的開銷。添加天空盒子skybox,使得虛擬校園更美觀。
小地圖的制作需要添加新的攝像機作為小地圖專用攝像機,從上往下垂直拍攝校園道路層。創建一個球體,去掉其Sphere Collider屬性,放置在第一人稱膠囊體的層級之下作為第一人稱的替代體,跟隨主攝像機移動并在小地圖中顯示出來。保持小地圖視圖是正方形的攝像機主要代碼為:
float px=(float)Screen.width/(float)Screen.height;//獲取分辨率比例
this.camera.rect=new Rect((1-0.2f),(1-0.2f*px),0.2f,0.2f*px);//保持攝像機視圖為正方形
(三)第一人稱漫游設計與實現。本部分主要分為第一人稱移動控制、場景切換設置、媒體播放設置三個部分。
1.第一人稱移動控制。首先,選中場景中的所有物體,為它們添加Mesh Collider多邊形碰撞組件設置為不可穿越的對象,取消Is Trigger屬性使其僅作為觸發器使用。使用Cretate Empty創建空游戲體作為第一人稱的替代體,為其添加Character Controller角色控制器組件使其變為膠囊體以模擬人體的大致形狀。為膠囊體添加Rigidbody剛體組件,使其在移動的過程中與環境產生碰撞交互,避免發生穿墻撞樹的行為。使用鍵盤、鼠標控制攝像機跟隨第一人稱移動的代碼分別如下。
(1)使用鍵盤WSAD鍵控制第一人稱替代體移動的C#腳本代碼。
void Control() {
//獲取鼠標移動距離
float m_h=Input.GetAxis(“Mouse X”);
float m_v=Input.GetAxis(“Mouse Y”);
//旋轉攝像機
m_camRot.x-=m_v;
m_camRot.y+=m_h;
m_camTransform.eulerAngles=m_camRot;
//使主角的面向方向與攝像機一致
Vector3 camrot=m_camTransform.eulerAngles;
camrot.x=0; camrot.z=0;
m_transform.eulerAngles=camrot;
if (Input.GetKey(KeyCode.W))
{ m_Transform.Translate(Vector3.forward * 0.1f, Space.Self); }
if (Input.GetKey(KeyCode.S))
{ m_Transform.Translate(Vector3.back * 0.1f, Space.Self); }
if (Input.GetKey(KeyCode.A))
{ m_Transform.Translate(Vector3.left * 0.1f, Space.Self); }
if (Input.GetKey(KeyCode.D))
{ m_Transform.Translate(Vector3.right * 0.1f, Space.Self); }
}
(2)使用鼠標控制第一人稱替代體移動的C#代碼。
protected Transform m_transform;
protected Vector3 targetPos;//目標位置
void Start() {
m_transform = this.transform;
targetPos = this.m_transform.position; }
void MoveTo() {
if (Input.GetMouseButton(0))
{ Vector3 mousePos = Input.mousePosition; //獲得鼠標屏幕位置
Ray ray = Camera.main.ScreenPointToRay(mousePos); //將屏幕位置轉為射線
RaycastHit hitInfo; //用來記錄射線碰撞記錄
bool isCast = Physics.Raycast(ray, out hitInfo, 1000, inputMask); //產生射線
if (isCast) {
targetPos = hitInfo.point; //如果射中目標,記錄射線碰撞點
}
}
//使用Vector3提供的MoveTowards函數,獲得朝目標移動的位置
Vector3 pos = Vector3.MoveTowards(this.m_transform.position, targetPos, speed * Time.deltaTime);
this.m_transform.position = pos; //更新當前位置
}
2.場景切換設置。為了減少虛擬校園主場景載入負擔,本次設計將進入建筑物內部的漫游采用場景跳轉切換的方式進行,在相應的建筑物邊上加入UI控件Button設置進入內部漫游指示牌,使用代碼Application.LoadLevel(“scence_n”);跳轉切換場景。
3.媒體播放設置。在游覽時播放相應的音樂,可以增加漫游的趣味性。在主場景中為地面或主攝像機添加audio source組件,在其屬性面板的AudioClip項中添加背景音樂文件,保持play on Awake和Loop選項的選擇以保證在運行場景時循環播放音樂即可實現背景音樂的添加。
當進入建筑物內部瀏覽時,可以選擇播放相關的講解音頻或宣傳視頻,增強宣傳效果。添加講解音頻主要代碼如下:
public AudioClip audioClip; //定義聲音文件
private AudioSource m_audioSource; //定義聲音源
void Awake() {
m_audioSource = this.gameObject.AddComponent
m_audioSource.loop = true; //設置聲音的循環播放
m_audioSource.volume = 1.0f; //設置最大音量值
m_audioSource.clip = audioClip;
}
void OnGUI() {
if(GUI.Button(new Rect(10, 10, 80, 30),"播放")) {
m_audioSource.Play(); }
if(GUI.Button(new Rect(10,50,80,30),"停止")) {
m_audioSource.Stop(); }
}
目前比較流行的視頻播放方式有兩種,一種是直接在場景的物體上播放,另一種是在GUI層面上播放。不管哪一種視頻播放方式,其主要代碼如下:
public MovieTexture m_movTexture; //定義視頻紋理
void Start () {
……
M_movTexture.loop = true; //設置視頻紋理的播放方式為循環播放
}
void OnGUI(){
if (GUILayout.Button ("播放")) {
if(!m_movTexture.isPlaying)
m_movTexture.Play(); }
if (GUILayout.Button ("停止"))
m_movTexture.Stop ();
}
三、測試與分析
在完成所有功能后運行場景測試其流暢性,觀察模型、貼圖與實際是否相符等,修改并重復測試,最后導出為EXE格式。測試證明,采用上述的設計理念和方法實現了基于3DSMAX和Unity3D的三維虛擬校園漫游,其運行流暢、逼真程度高、交互性強,能夠滿足不同用戶的需求。
總之,本次漫游設計使用了AutoCAD、Photoshop、3DMAX、Unity3D等軟件,以廣西理工職業技術學院實景校園為藍本進行了設計和制作,實現了三維虛擬校園的漫游。在后續還可對漫游設計進行二次開發,加入更多元素以豐富虛擬校園漫游,使漫游更真實;同時開發適用于多平臺的版本,以增強對外宣傳的效果。
【參考文獻】
[1]王彩玲,劉瑞香,宋釗.基于Unity3D的虛擬校園漫游的設計與實現[J].科技視界,2015(5)
[2]郭仁春,霍西寶,玉錦宏,等.基于3DMAX及Unity3D技術實現數字化虛擬校園的網絡建設[J].信息系統工程,2017(5)
[3]劉發久.基于Unity3D的虛擬校園[J].電子設計工程,2016(6)
[4]李吉鋒.基于3DS MAX及UNITY 3D的虛擬校園系統的設計與實現[D].廈門:華僑大學,2016
[5]董春俠,司占軍.基于Unity3D的虛擬校園App設計與開發[J].軟件導刊,2017(2)
[6]王星捷,李春花.基于Unity3D平臺的三維虛擬城市研究與應用[J].計算機技術與發展,2013(4)
【作者簡介】蒙秋瓊(1984— ),廣西理工職業技術學院計算機應用專業教研室主任,講師。
(責編 盧 雯)