總體分享思路和安卓apk測試類似,除了從用戶角度通過“用”來測試,,同樣需要知道開發(fā)一款VRapp是使用了哪些技術(shù)方法完成的,,只有了解其實現(xiàn)之后才可以從白盒角度輔助分析進(jìn)行庖丁解牛,然后才有各種測試框架和工具的開發(fā),。下面是本次分享的主要章節(jié)流程。
VR原理在談VR之前我們先看看幾個容易混淆的概念,,你平時玩的CF,、CallofDuty等3D游戲是虛擬現(xiàn)實嗎?全景照片呢?虛擬現(xiàn)實和3D電影有什么關(guān)系,?在理清這些問題前,,先看看相關(guān)書籍材料中是如何闡述VR虛擬現(xiàn)實的。 什么是VR“虛擬仿真(virtual Reality)技術(shù),,又稱虛擬現(xiàn)實技術(shù),,是近年來出現(xiàn)的高新技術(shù),,虛擬現(xiàn)實利用電腦模擬產(chǎn)生一個三維空間的虛擬環(huán)境,,通過輸出設(shè)備提供給使用者關(guān)于視覺、聽覺,、觸覺等感官的模擬,,讓使用者如同身臨其境一般,,并能夠及時、無限制地觀察三維空間內(nèi)的事物,,通過各種輸入設(shè)備與虛擬環(huán)境中的事物進(jìn)行交互,。” ----《虛擬仿真與游戲開發(fā)實用教程》
“虛擬現(xiàn)實技術(shù)是指計算機(jī)產(chǎn)生的三維交互環(huán)境,,在使用中用戶“投入”到這個環(huán)境中去,,并在人工合成的環(huán)境里獲得“進(jìn)入角色”的體驗?!?/span> “’virtual Reality’一詞始于1989年,,由VPL Research公司的奠基人Jaron Lanier在有關(guān)雜志上使用?!?/span> ----《虛擬現(xiàn)實視景仿真技術(shù)》
“1993年Grigore C.Burdea在Electro 93國際會議上發(fā)表的“Virtual Reality Systemand Application”一文中,,提出了虛擬現(xiàn)實技術(shù)的三個特征,即:沉浸性,、交互性,、構(gòu)想性?!?/span> Figure 1 虛擬現(xiàn)實的3i特征 ----《虛擬現(xiàn)實技術(shù)》 根據(jù)上面的解釋,,可以簡化理解為,一套計算機(jī)系統(tǒng)產(chǎn)生的虛擬環(huán)境,,用戶能看到聽到“觸碰到”虛擬環(huán)境中的物體,,感覺“活”在對應(yīng)的虛擬世界。 根據(jù)上面的解釋后我們再來看看前面的疑問,。 3D游戲中的3D圖形圖像技術(shù)的確是虛擬現(xiàn)實的核心技術(shù)之一,,但是在視覺成像上不是靠視覺距離感知的3D而是逼真的3D建模和持續(xù)的交互讓我們強(qiáng)制理解為一個“虛擬世界”,當(dāng)畫面停止時,,我們看到的就是一副靜態(tài)的圖片,,所以其“沉浸”感不符合要求,。 全景照片可以通過移動頭部看到不同方位的景色,但是觀察者對“虛擬世界”的交互幾乎為0 ,,所看到的只是前期特殊攝像機(jī)拍照合成的照片而已,。 3D電影則是使用彩色眼鏡濾光技術(shù)或者偏振眼鏡濾光的技術(shù)讓兩眼看到不同的內(nèi)容形成和真實視覺類似的景深感,用戶不可能看到畫面中的其他方向的內(nèi)容,,所有人只能看到固定的內(nèi)容,,所以在交互和沉浸上幾乎都為0 。 簡單總結(jié)下這三種觀感對于VR的特征滿足度:
人如何感知距離雖然目前虛擬現(xiàn)實的設(shè)備很多,,有Oculus這種計算能力靠外部PC輸入和屏幕分離的,。也有暴風(fēng)眼鏡這種完全借助手機(jī)運算、顯示一體的封裝外殼的設(shè)備,。他們在最終畫面的顯示原理上是一致的,,只是分辨率和響應(yīng)速度的差異。而這個原理就需要從人眼和大腦如何確定感知物體的距離說起,。 這里要提到的就是三角測量法,。每個人左右眼的距離可以理解為固定的。當(dāng)人看遠(yuǎn)處的物體上某個點時,,點與兩眼的連線形成兩個夾角,。利用三角測量的原理,人腦可以感知該點是有距離的,,也就是有深度的,。當(dāng)然大腦會迅速對整個畫面中所有點進(jìn)行快速計算得到整體的深度信息(這也是大腦神奇的地方所在)。從而人知道面前哪些是可以行走的路,,哪些是阻擋的障礙物,,需要跨越和躲避。 Figure 2 三角測量與距離計算 根據(jù)上面的信息,,我們總結(jié)一下,,大腦之所以通過眼睛識別出眼前的景象是否有遠(yuǎn)近關(guān)系,根本上是和三角測量一樣的道理,。其一是:兩眼位置固定,,其二是兩眼同時觀察同一個目標(biāo)。有了這個共識我們就可以繼續(xù)下面的分析,。
Unity中如何實現(xiàn)虛擬現(xiàn)實在Unity中,,使用攝像頭這種對象來觀察虛擬世界,攝像頭可以有多個,,如果我們使用兩個攝像頭分別投向虛擬世界中,,并且把攝像頭擺放的位置相對固定,那么它們所拍攝到的內(nèi)容就可以幾乎等同于人進(jìn)入虛擬世界后,,左右眼分別能看到的內(nèi)容,。 在現(xiàn)實世界中我們的3D電影的拍攝就是利用的類似原理,。關(guān)鍵字:“雙攝像頭”,“固定位置”,。可以參考下面的圖片直觀的理解,。 Figure 3 3D攝像機(jī)的“大眼睛” 下面這張圖就是unity中的攝像機(jī)的預(yù)覽窗口,,可以看到畫面中的槍的角度略有不同,這正是符合實際觀察效果的,。Unity中在放置攝像頭時可以通過編輯界面看到攝像頭視角對外的“輻射”范圍,,使用白色的線條表示出來。 在Unity中可以使用腳本來控制攝像頭的方向和支點坐標(biāo),,也可以把陀螺儀的變化影響到攝像頭從而形成視覺跟蹤頭部運動的效果,。在下面會詳細(xì)解釋。 Figure 4 相機(jī)與視角的匹配 Unity虛擬世界中的核心概念Unity作為目前業(yè)界占有率最高的游戲開發(fā)平臺,。主要在于其IDE極大的提升了開發(fā)者的效率,,很多動作拖放即可完成。我們要制作VRdemo首先需要制作一個3D 的虛擬場景,,然后利用調(diào)整攝像頭的運動轉(zhuǎn)化為VR效果,,實際在時間投入上制作虛擬場景占用80%以上的時間。下面一部分借助一個小島上扔球的游戲主要說明unity中核心的概念,,這些概念有助于理解虛擬世界的構(gòu)建以及交互方法,。(具體IDE操作熟練不在本分享范圍,太詳細(xì)的操作就省略,,代碼給出核心部分) Figure 5 小島扔球 理解坐標(biāo)系在unity中主界面scene窗口是我們布置虛擬世界的主窗口,,一般是俯視這個虛擬世界,類似上帝視角,。我們布置地面,、樹木、人物時可以從這個視角操作,,可以利用鼠標(biāo)右鍵旋轉(zhuǎn)視圖,,使用滾輪縮放視圖。 一般X軸是前后方向,,Z軸是左右方向,,Y周是上下方向??梢酝ㄟ^右上角的坐標(biāo)小工具快速切換“正面”,、“側(cè)面”、“底面”等視角,。理解和熟練操作unity的坐標(biāo)是一切的開始也是貫穿始終的要點,。
Figure 6 unity的坐標(biāo)系 在這個坐標(biāo)系中,,可以設(shè)置物體的X、Y,、Z的坐標(biāo),,想放哪兒就放哪兒。還可以設(shè)置物體的朝向,,希望它“看”哪個方向,。比如你有一把槍。還可以調(diào)整物體的縮放比例,,你從外部導(dǎo)入一個太大或者太小的模型,,可以使用縮放讓他以合適的比例存在虛擬世界中。 Figure 7 設(shè)置物體位置參數(shù) 下面這幅圖是采用Component->3DComponent->Terraim制作的島嶼,,我們的虛擬世界背景就是這個,,面朝大海的小島,我在小島岸邊不停的扔著球,。 Figure 8 小島方位與坐標(biāo)系 理解攝像頭前面已經(jīng)提到,,unity使用攝像頭來對準(zhǔn)虛擬世界的某個角落,通過這個攝像頭我們能看到這個角落的物體,。攝像頭具有多種屬性,。常用的屬性如下: 1、坐標(biāo):決定這個攝像機(jī)擺放在哪個位置 2,、FOV:視野范圍,,類似高檔相機(jī)的FOV,代表所能覆蓋的范圍,。 3,、Viewport Rect:視野的寬窄、高度,。 Figure 9 unity中攝像頭主要屬性 Viewportrect的w屬性(寬度)不能設(shè)置的太大和太小,,因為人眼觀察物體時,重合的區(qū)域是有一個區(qū)間的,。超過這個區(qū)間顯示的效果就不合理,,觀察者會迅速頭暈?zāi)垦!H缦聢D中左右眼FOV的交集是110度左右,。 Figure 10 人眼FOV的邊界 在本此演示中,,使用暴風(fēng)魔鏡SDK中的預(yù)設(shè)MojingHead,其中子元素的攝像頭對準(zhǔn)了場景中的QQ墻,。從一張近圖和一張遠(yuǎn)圖可以看到攝像頭的范圍,。 Figure 11 近距離查看攝像頭 Figure 12 遠(yuǎn)距離查看攝像頭的全部視野 模型與紋理在unity中我們看到的虛擬世界具有豐富多彩的效果,除了3D模型本身的細(xì)致之外,,模型的貼圖也是關(guān)鍵,。一般給一個物體添加紋理的流程分為三個步驟,。 1、導(dǎo)入外部的圖片(PNG,、JPEG等),。 2、添加材質(zhì)球,,給材質(zhì)球添加圖片紋理(便于觀察各個角度的光線),。 3、用材質(zhì)球賦予物體光鮮的“色彩”外衣,。 Figure 13 給模型添加紋材質(zhì)
在本場景中,我們使用一個簡單的cube添加一個QQ的圖標(biāo),。具體效果如下,,被賦予材質(zhì)的物體可以是球體、長方體,、不規(guī)則體,。 Figure 14 QQ方塊組成的墻 運用燈光現(xiàn)實世界是充滿各種光源的(否則是誰奪去了城市上空的星辰),在unity的虛擬世界中有4種光源供我們使用,。合理運用光源,,讓虛擬世界更真實。 A,、Directional light方向光,。類似于太陽光,所有被照到的物體有同一方向的陰影,。 B,、Point light點光源。類似于一個燈泡,。以球面擴(kuò)展開的照射角度,。 C、Spotlight聚光燈,。類似手電筒的效果,。 D、Area Light 區(qū)域光,,一般用于光照貼圖烘培,。 光源的主要屬性有: 1、坐標(biāo)和方向,。這盞燈放在哪里,,燈口朝哪個方向。 2,、范圍,,這盞燈的燈口有多寬,。 3、亮度,,這盞燈有多少瓦,。 Figure 15 光源的主要屬性 在場景中,我們放置的是一個方向光,。大白天的效果,。山上的小山包和樹木都有相同方向的影子。 Figure 16 一個方向光的實例效果 父子對象的關(guān)聯(lián)在unity中我們的虛擬場景中會有很多的元素,,很多時候我們需要幾個物體作為一個整體位移和運動,。這個時候可以使用父子關(guān)系把元素關(guān)聯(lián)起來,拖動一個元素到另一個元素下面(類似windows上拖動文件到文件夾)即可,。一旦形成父子關(guān)系,,改變父對象的坐標(biāo)和方向?qū)⒂绊懰凶訉O節(jié)點的坐標(biāo)和方向。 本場景中我們的QQ墻是由一個個QQ磚塊組成的,。 在暴風(fēng)魔鏡以及cardboard的庫中,,使用一組攝像頭對象組成了頭盔對象。 Figure 17 對象的父子關(guān)系 腳本關(guān)聯(lián)對象虛擬世界中的物體需要按一定的物理原理進(jìn)行移動,,人物的話需要走動,。除了運動還有銷毀對象等操作,都可以通過代碼來完成,。在unity中可以通過給對象綁定一個腳本,,在腳本中實現(xiàn)指定的接口來達(dá)成。 Figure 18 綁定新的腳本 一個新的腳本默認(rèn)會有兩個方法,,在update方法中我們可以做各種操作,,具體就看場景需要。熟練開發(fā)要基于對API的了解,。
在本場景中,,我在主攝像頭下面掛載了一個空白對象GameObject->Create Empty,取名eyePostion代表眼鏡所看到的方向,,然后給其設(shè)置了一個用來發(fā)射小球的腳本,。 Figure 19 物體和腳本關(guān)聯(lián) 更多的腳本編寫案例在后續(xù)實踐中會逐步總結(jié)。預(yù)期會按照場景來提煉,比如如何發(fā)射一個子彈,,如何讓一個物體自傳,,如何在場景中動態(tài)生成敵人,如何讓兩個物體互相發(fā)消息,,如何控制一個對象數(shù)秒后自動銷毀(節(jié)省內(nèi)存),。
使用音效前面提到虛擬世界給人的感官除了視覺還有聽覺,在現(xiàn)實中,,聲音隨著人的移動和方向變化,,左右耳聽到的聲音的大小是隨時變化的??焖僖苿拥奈矬w發(fā)出的聲音還會產(chǎn)生多普勒效應(yīng),。在unity中使用音效非常的方便,主要以下步驟: 1,、使用import命令導(dǎo)入各種聲音文件到工程(MP3、wav),。 2,、在關(guān)聯(lián)的腳本中添加變量,并通過拖動方式綁定變量和聲音文件,。 3,、在需要播放的時機(jī)調(diào)用PlayXXX方法。 當(dāng)然,,聲音源的制作和剪輯有很多工具,,推薦一款老牌實用工具Goldwave。
Figure 20 如何播放聲音 使用預(yù)設(shè)在各類動畫制作軟件中都會有模板這個概念,,比如Flash,。你可以把一些物體創(chuàng)建為模板,后續(xù)可以使用類似“new”的語句動態(tài)的創(chuàng)建出來,,起到復(fù)用的效果,。Unity也不例外。在這里稱作預(yù)設(shè)(Prefab),。創(chuàng)建prefab有兩種方式: 1,、先創(chuàng)建空的Prefab,然后把其他元素拖進(jìn)去,。 2,、直接把設(shè)計好的單個元素拖到project中直接創(chuàng)建一個Prefab。(技巧) Figure 21 創(chuàng)建空的prefab 有時候我們發(fā)現(xiàn)之前創(chuàng)建的一個Prefab后來放到界面中去后,需要調(diào)整參數(shù),,我們調(diào)整的一個具體實例參數(shù)后,,可以使用“apply”方法應(yīng)用到Prefab,讓所有畫面中的實例生效最新的修改,。(這也是unity易用性的一個體現(xiàn)),。 Figure 22 實例修改應(yīng)用到 Prefab 在本場景中我們要發(fā)射的小球和QQ墻都是已經(jīng)設(shè)置為了預(yù)設(shè)。這樣方便整體的創(chuàng)建,,以及用代碼來動態(tài)生成,。 Figure 23 QQ墻作為了預(yù)設(shè) 剛體Unity內(nèi)置了NVIDIA PhysX物理引擎,可以讓虛擬世界的物體自由下落,,碰撞,,彈起。剛體(RigidBody)用通俗的話說就是賦予一個物體重量,。除了重量外還可以設(shè)置物體在運動過程中收到的阻力,,有普通的運動空氣阻力和角速度的阻力(旋轉(zhuǎn)過程中的阻力),下圖中是剛體的主要配置界面: Figure 24 剛體的配置 在剛體運動控制的代碼中有下面主要屬性:
這里說一個例子,,比如我們希望虛擬場景中有一個物體在場景開始播放時自動的,、永遠(yuǎn)的、隨機(jī)角度的旋轉(zhuǎn),,可以設(shè)置Angular Drag=0(永遠(yuǎn)的),,然后可以這么寫。
在本場景中,,我們讓球體和QQ磚塊都添加了剛體組件,,受到虛擬世界的重力影響。 Figure 25 有剛體組件的方塊 碰撞體物體有了自己的重量,,受力后必然會有運動的趨勢,,一旦運動起來物體之間避免不了碰撞,子彈射擊敵人,、一面墻擋住人前進(jìn),、球撞上一面墻,這些需要給物體賦予碰撞體。Unity中根據(jù)物體外形的分類,,給出了多種碰撞體的模型常見的有box collider,、sphere collider、Capsule collider,,對應(yīng)長方體,、圓球、膠囊體,。對應(yīng)的預(yù)覽效果如下: Figure 26 不同的碰撞體 物體碰撞后我們需要觸發(fā)代碼,,實現(xiàn)碎裂、發(fā)出爆炸聲等效果,。處理兩個物體碰撞一般有下面幾個步驟: 1,、給對象設(shè)置tag,標(biāo)記為哪一類物體(敵人,、一般物體,、玩家) 2、給對象添加合適的碰撞體,,并開啟“IStrigger”開關(guān),,允許觸發(fā)碰撞 3、在綁定代碼中重載OnTriggerEnter(other : Collider )方法,,其中other是碰撞的對方物體
在本場景中,,我們暫時的創(chuàng)意還不需要再碰撞后有其他效果,所以只需要增加碰撞體即可,。 Figure 27 添加碰撞體 獲取組件在unity中一個物體甚至是空的物體根據(jù)場景設(shè)計需要會添加很多的組件,比如前面的腳本(腳本可以有多個),、剛體、碰撞體,,在代碼調(diào)用中我們會需要用到這些組件,。添加組件可以通過Component->Physics->Box Collider菜單方式添加,也可以直接在偵測面板中添加: Figure 28 添加各類組件 Figure 29 移除組件 在代碼中使用組件的典型參考如下: Figure 30 代碼中調(diào)用組件 關(guān)于調(diào)用順序在unity的腳本框架中,,我們根據(jù)場景需要會實現(xiàn)默認(rèn)的接口函數(shù),,比如最常用的Update()和Start()。這兩個函數(shù)在新建時就有,。其他的則需要在代碼中主動敲入,。在復(fù)雜的場景中我們需要準(zhǔn)確的了解并控制代碼執(zhí)行的順序(你所設(shè)定的機(jī)制處理的邏輯)。對于需要詳細(xì)了解這些函數(shù)的童鞋可以參考MonoBehaviour類,。這個類是所有場景中元素的父類,。 http://docs./ScriptReference/MonoBehaviour.html Figure 31 腳本控制類的父類 在我們調(diào)試過程中,不由自主的想知道最初的代碼從哪里執(zhí)行,執(zhí)行過程的順序,。(學(xué)習(xí)C語言大家都是從main函數(shù)開始)下面就是unity中常見事件的執(zhí)行順序,。 Figure 32 unity中常見事件執(zhí)行順序
小結(jié)以上這些概念必將貫穿各類場景制作中,正確的理解,,在需要的時候添加運用,。其實這個思路和我們學(xué)習(xí)一門語言類似,了解其能力后,,在合適的時候根據(jù)我們的業(yè)務(wù)場景把這些能力(比如合適的API方法)用起來,,形成我們的軟件。
|
|
來自: 8V科技 > 《vr行業(yè)》