自從上次寫完這個系列的第三篇,忙了一陣子的項目,忙了一陣子的英語,考完一大波考試之後,終于能繼續給大家分享一些開發心得了,這期間有好幾個同學給我私信甚至qq我,問我啥時候更新,無奈實在是太忙,隻能一拖再拖,我感覺是十分對不起大家的,沒能及時更新,這裡給大家說個對不起。不過能有這麼多人關注我的部落格,這也是對我最大的肯定,能得到大家的認可心裡十分的高興,希望大家能繼續關注我,我一定會陸陸續續的把我自己的一些經驗心得認認真真的去整理分享給大家的~
另外,關于cardboard sdk for unity的英文版api我已經分享在了我的部落格裡,我還自己翻譯了一份中文版的供大家參考,以下是位址:
其實cardboard提供的東西都在這裡了,我接下來寫的内容隻是幫助大家更容易的上手,還有一些我自己的經驗技巧罷了。另外,這個東西還是比較新的,google也一直在做後續的更新,我的部落格隻能寫到這個時間點上的内容,至于最新的動态和更新,大家隻能去關注谷歌的官網了~,這個網址前幾篇的時候已經提到過了。
再就是除了本篇之外,我之後會寫一些cardboard虛拟現實相關的開發技巧,下面是我目前拟定的一些内容,希望對大家有所幫助:
在虛拟現實中播放視訊的幾個解決方案
如何在虛拟現實中高效解決視訊畸變
如何在虛拟現實中快速設定螢幕常亮
如何在虛拟現實中輕松解決手機适配
如何在虛拟現實中快速擷取頭部資料
如何在虛拟現實中布置一個随頭部移動的物體
如何在虛拟現實中實作注視讀秒點選
閑話說到這裡,下面繼續說正事:
在上一篇文章中,我們利用了cardboard sdk for unity的demo建立了一個自己的場景,也就是把自己的模型放進場景,用虛拟現實眼鏡就可以進行觀賞了。
我們要想利用這個demo進行下一步的開發,就要對其有一些基本的了解,本篇将會對官方demo進行一些解析,希望對大家能有所幫助。
導入和運作的過程第二篇已經講得很清楚了,不清楚的同學到前面翻翻就可以了。
我們打開assets/cardboard/demoscene下的demoscene,大家也發現這個檔案夾下的東西并不多,而這些就是這個demo的全部了,僅僅隻有一個腳本代碼檔案。

這個demo運作之後會有這麼幾個功能:
運作之後,按住alt移動滑鼠模拟頭部轉動,按住ctrl模拟歪脖子的時候視角的變化,點選滑鼠相當于觸發,可以用來操作。
把目光也就是小黃點對準方塊,點選滑鼠,方塊會傳動到一個有距離限制的球面上的随機位置
當目光注視方塊,方塊會從紅變成綠色,當目光離開方塊,方塊會從綠色變回紅色
在腳下有三個按鈕,分别是
reset:重新把方塊放回初始位置
recenter:重新把視角左右方向上回歸中間,用于校準
vr mode:打開或者關閉vr模式(分屏與否)
首先我們看到左側的hierarchy面闆,這裡就把demoscene裡的元件一覽無疑了,一個cube自然是那個會變色的紅綠方塊,一個plane是下面的黑底方格地闆,還有一個point light作為光源,一個canvas下面是一個放了三個按鈕的面闆,熟悉unity的同學肯定對這些再熟悉不過了。比較特殊的是一個cardboardmain和一個eventsystem,虛拟現實的效果就是由cardboardmain這個cardboard主錄影機搞定的,而eventsystem是與注視點(就是那個小黃點)相關的,這裡我們稍後解釋。
我們去仔細的看每個元件,地闆和光源沒啥特殊的,但是方塊cube就不一樣了:
<b>1.整個demo唯一的代碼附在了cube身上</b>
2.cube帶有一個box collider(碰撞器),這也就是為什麼我們可以使用視線(那個黃點)去點選方塊的原因:隻有一個物體有碰撞效果,才能檢測到與視線發生了碰撞,進而進行一些操作。(大家可以發現隻有看到帶有碰撞器的物體時,小光點才會顯示出來)
3.cube有一個eventtrigger來接收之前提到的eventsystem的事件,并用這些條件來調用方法。
我們可以從上圖的cube的inspector視窗看到,cube有一個eventtrigger。
eventtrigger是用來接收來自eventsystem的事件,每當接收事件時,就會調用這些方法。是以這裡就比較清楚了。
<b>pointer enter指的就是眼睛看到這個物體時,然後就會調用附着在cube上的teleport腳本的setgazeat(bool)方法,并且傳入一個true(注意那個箭頭是打上的)</b>
<b>pointer exit指的就是眼睛離開這個物體時,然後同樣會調用附着在cube上的teleport腳本的setgazeat(bool)方法,并且傳入一個false(注意那個箭頭是沒打的)</b>
<b>pointer enter指的就是用黃點點選了這個物體(這裡就是點選看着cube點選滑鼠或者觸摸屏),然後就會調用附着在cube上的teleport腳本的teleportrandomly方法,顧名思義就是轉移到一個随機的位置</b>
順藤摸瓜,接下來當然是看看teleport的代碼了,看看這幾個方法到底是啥:
這裡我對這個類加了注釋,應該寫的很清楚了:
<b>下面我貼的這個代碼可能和執行個體裡的有點差別,我加了幾個大家可能比較常用的方法,比如關掉中間那條白線,關掉設定按鈕的方法,大家讀代碼的時候可以留意一下</b>
是以這裡大家就可以了解為什麼看到cube的時候會變綠,而眼睛離開會重新變紅了吧,随機傳送也一目了然。
然後這個類裡面的另外幾個方法,就是通過腳底下的幾個按鈕來調用的,大家點選這三個按鈕,就可以在右側的inspector視窗看到他們分别調用了綁定在cube上的teleport腳本的togglevrmode(),reset(),以及carboard的recenter方法。
<b>resetbutton</b>
<b>resetbutton調用了teleport的reset()方法,将方塊傳送回初始位置</b>
<b>recenterbutton</b>
<b>recenterbutton調用了cardboard的recenter()方法,重新校準”前方”,比如你坐在電腦桌前看到的是正前方,你的朋友坐在你的背後和你背對背,他戴上眼鏡看到的是場景的正後方,點選這個按鈕之後,将會将場景正前方的位置校準為目前的實際朝向,你的朋友就會看到正前方了,而你再拿回眼鏡的時候看到的将是正後方。</b>
cardboard類中的recenter方法:
<b>vrmodebutton</b>
<b>vrmodebutton調用了teleport的togglevrmode()方法,打開/關閉vr模式,所謂打開vr模式就是上面我們看到的那種雙眼雙屏效果,而關閉則會變為單屏,就是下圖這種效果:</b>
到這裡整個demo的功能實作就告一段落了,大家對這個demo應該已經看得比較透徹了,接着demo的思路大家就可以比着葫蘆畫瓢,以這個demo為基礎繼續自己的開發了,本篇的篇幅也不短了,就寫到這裡吧,希望對大家有所幫助。
總結一下就是cardboardmain作為cardboard提供的主攝像頭,實作了虛拟現實的效果,這裡大家看文檔的話會有更深的了解,而且也會看到谷歌在背後做的工作還是很多的,像是畸變的處理等等複雜問題,谷歌已經幫我們做好了,再比如後續我會講到關于這個主攝像頭的用法,裡面已經封裝好了很多方法供我們使用,比如可以适配不同手機等等。再就是demo中的eventsystem與head下的gazepointer提供了注視點的一系列接口,我們可以用eventtrigger來使用這個注視點作為虛拟現實中的三維滑鼠去做一些事情,也可以去自定義注視點,這些我都會在後續中仔細講解。
這個系列的目的一是我自己在網上查資料的時候發現沒有什麼資料,是以分享出來幫助大家,另外就是個抛磚引玉的作用,相信對unity比較熟悉的同學,基于谷歌做的這些工作,很快就可以開發出很贊的虛拟現實應用了~
這個插件還是有一些問題的,我開發的時候就遇到了不少,比如有時候陀螺儀會亂飄,api提供的擷取頭部資料的方法擷取回來的數一直不變,在後續中我會盡量把這些問題的解決方案分享給大家,還希望大家繼續關注我,謝謝~