UNITY VR 視頻/圖片 開發心得(一)


  現在的VR似乎沒有之前那么火熱了,於是乎我居然開始了VR征程。。。

  說起VR,對於沒有接受過相關知識的人來說可能看起來比較高大上,但是VR的原理卻沒有想象中那么復雜。總的來說,VR之所以能夠產生立體感,是因為人有兩只眼睛。其實現在有很多自稱VR的視頻或者圖片嚴格來講並不能算是VR,因為它只是將一平面圖變成了360°的圖,其實和平面圖是一樣的,並沒有深度信息,只是你可以轉轉小腦袋來全方位觀察而已。如下圖:

  可以看到圖片是扭曲的,至於為什么人眼在VR眼鏡中看到的圖像是正常的,是因為這張圖片並不是直接看的,它需要把整個圖像投影到一個球體的內表面(可以想象一下把地球儀展開成一個平面圖並且補充裂開的部分),然后攝像頭位於球體內部的中心,這時候從VR眼鏡中看到的就只是這個球的一小部分,當然,可以轉動你的小腦袋來全方位觀察,當轉動的時候通過陀螺儀的讀書來計算相機的轉動角度。這種VR的原理大概就是如此了,是不是覺得很簡單!

  真正有深度信息的VR圖片/視頻其實是有兩部分的,其中比較多的是左右屏和上下屏,這時候就不能把它直接投影到一個球上了,而是投影到兩個球上,並且需要有兩個攝像機分別來提供左眼和右眼的圖像,此時左眼和右眼看到的圖像並不是完全一致的,有一定的錯位,就跟我們睜開眼看這個世界一樣,所以此時看到的圖像就是立體的,有深度信息的。如下圖:

(圖像比較渣,將就看)

上圖中上下看起來是差不多的,但是實際上是有差別的,投影的時候會把上半部分投影到左眼,把下半部分投影到右眼,具體如何實現會在后面講。除了上下分屏其實還有左右分屏的,原理都差不多了。

 

  原理講得差不多了下面講開發:

  首先你要准備開發環境:Unity#D5.6(最新),安卓SDK(5.1以上),JDK,Visualstudio 2017(可選),Andoridstudio(可選)。Unity插件:EasyMovieTexture3.59(商用就買,個人愛好可以去搜搜其他人的分享)。

  首先來看普通的全景圖(沒有分屏的),這里強行假設你已經搭建好了所有的環境,打開Unity3D,新建一個3D Project,這時候你將得到一個miancamera和一個平行光,將平行光刪掉(喜歡也可以留着)。新建一個球體,然后導入一張全景圖,將圖片拖到剛剛創建的球體上,可以看到現在的球體已經被你的圖片包圍了,然后將球的Scale屬性xyz分別設置為5,5,-5(其它等比例也行,但是要保證比相機要大). 至於為什么z軸是-5,等會講到。將相機和該球的位置都設為0,0,0. 這時點擊相機,你將會在預覽窗口什么都看不到,因為你的圖片是貼在了外表面。需要想辦法把圖片貼到內表面去,感謝王文剛老鐵提供的Sharder。

Shader "Unlit/DoubleSided" 
{ 
 Properties 
 { 
 _Color("Main Color", Color) = (1,1,1,1) 
 _MainTex("Texture", 2D) = "white" {} 
 } 
 SubShader 
 { 
 //Ambient pass 
 Pass 
 { 
 Name "BASE" 
 Tags {"LightMode" = "Always" /* Upgrade NOTE: changed from PixelOrNone to Always */} 
 Color[_PPLAmbient] 
 SetTexture[_BumpMap] 
 { 
 constantColor(.5,.5,.5) 
 combine constant lerp(texture) previous 
 } 
 SetTexture[_MainTex] 
 { 
 constantColor[_Color] 
 Combine texture * previous DOUBLE, texture *constant 
 }
 }
 //Vertex lights 
 Pass{ 
 Name "BASE" 
 Tags {"LightMode" = "Vertex"} 
 Material 
 { 
 Diffuse[_Color] 
 Emission[_PPLAmbient] 
 Shininess[_Shininess] 
 Specular[_SpecColor] 
 }
 SeparateSpecular On 
 Lighting On 
 cull off 
 SetTexture[_BumpMap] 
 { 
 constantColor(.5,.5,.5) 
 combine constant lerp(texture) previous 
 } 
 SetTexture[_MainTex] 
 { 
 Combine texture *previous DOUBLE, texture *primary 
 } 
 }
 }
 FallBack "Diffuse", 1 
} 

這個Shader的意思其實就是讓球兩邊都貼上紋理。這時候再點擊攝像機你就能看到圖像了,但是你可能會發現這圖像是反的(你可能也會發現不了,但是它確實是反的),所以我們要將球的Scale.z值設基本為負數。到這里基本就完成了,接下來就是打包發布了,點擊file-build and setting 選擇安卓,點擊player setting,在other setting里將VR surport選上,選擇一個sdk(建議Google cardboard),然后build就可以了。不出意外的話生成了一個apk文件,安裝到你的大手機上就可以看到效果了。這時你會發現和想象中不太一樣,頂部和底部的形變比較嚴重,產生這樣的原因是因為Unity自帶的球體模型比較粗糙,這時候你可以在3dsmax中自己建一個球,把分段設大一點,建好后還可以將球的法線翻轉下,翻轉后就可以不用那個DoubleShader了。

  好了,一個簡單而不簡約的VR圖片觀察器就完成了,欲知后事如何,且聽下回BB!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM