下面的教程是我今天整理的資料,教大家一步步完成自己的3D立體游戲,並向大家介紹一些3D成像的原理。
理論上,每個普通的非立體3d游戲,都可以改為3D立體游戲,看完這篇帖子,你們都可以把自己之前做過的3D游戲改為立體游戲,那效果。。。
一直想嘗試用unity做3D立體游戲,昨天終於入手了一台3D顯示器,並成功模擬出3D信號,出現了3D效果:
帶上眼鏡后的觀看效果不錯,個人感覺比一般的3D電影的立體效果還要強。
第一步:了解偏振式3D成像原理
偏振式3D成像是根據人眼成像原理發明的,人眼看到的景象呈現立體感,是由於雙眼所觀察到的景象有略微的差別,因為瞳距(兩眼球之間的距離)導致觀察的物體的角度不同。
所謂偏振成像就是將兩幅不同偏振態的圖像送到雙眼,每只眼睛只允許看到其中一幅,我們用unity制作3D游戲,其實就是制作這兩幅圖像。或者說模擬3D信號。
第二步:了解現在的硬件技術能幫我們做什么,我們需要做什么
在3D顯示器出現之前,我們要做3D立體游戲,估計只能用兩台投影儀來實現3D效果了,不過現在的3D液晶顯示器大多都是集成好一鍵轉3D功能,在這里這個轉3D功能指的是自動識別左右半寬的信號(上下的就不考慮了,一般都是左右),並將其融合,轉換為偏振的3D信號,並通過3D眼鏡觀看到3D效果。當然現在的3D顯示器經常會宣傳說一鍵2D轉3D功能,這個功能不是我剛才說的融合,而是顯示器根據2D影像自動給加上景深,生成左右兩幅圖像,其實是偽3D,試了一下,的確略微有些效果,不過效果真的不怎么樣。。。我們這里還是做真的3D立體吧。
知道了顯示器能夠幫我們自動融合左右圖像后,我們就只需要模擬出左右半寬的圖像就OK了
第三步:如何用Unity3D模擬出3D信號
這步才是我們要做的重點。要模擬出真實的3D立體影像,首先要知道人眼成像原理,上面第一步說了,因為我們有兩只眼睛,並分開一定距離(大約150px),這樣就出現了距離感。我們都知道unity中的攝像機是模擬人的眼睛的,一般我們在unity中觀察場景都是創建一個攝像機,當然就沒有立體感了,要模擬人的眼睛,就要創建兩個攝像機(好吧,廢話一大堆,其實我就是想說,請先創建兩個攝像機。。。)。
把場景本來存在的主相機刪掉,把創建的兩個攝像機放在同一平面,分開很小的距離,角度調成一樣,注意不是往中間看,而是平視,人的雙眼也都是平視向前的,這個和焦距是兩個概念,別弄混了,類似於下面這樣:
至於相距多少,這個視環境而定,兩個攝像機之間的距離類似於人眼之間的距離。我們用自帶的第一人稱控制器來解釋這個距離。導入第一人稱控制,把這兩個攝像機拖到第一人稱控制器的攝像機下,作為子物體,把第一人稱控制自帶的相機關掉(enabled=false),就是把camera組件對號去掉。把左右相機的位置改為這樣:
左相機:
右相機:
對於第一人稱控制器的大小來說,這個0.06的距離夠用了,為什么說是夠用了,不是正好,是因為距離大點小點都是可以的,距離越大,景深越大,看起來更清晰,好像是距離拉近了,不過給人觀看的感覺更累了,這個很好理解,人的眼睛距離變大,就相當於人變成了巨人,或者眼前的景象拉近,也就是你把手指從遠處拉到眼前的感覺,當近到一定程度是,你要看你的手指就會很吃力,要不就重影~~再近,就是斗雞眼了,斗雞眼的感覺,你懂的。。。
如果距離拉近的話,3D感會漸漸變弱,最近就是兩個相機重合,重合后就沒有立體感了。所以這個距離要根據你看的場景而定,對於自帶的第一人稱控制器,它的大小作為人的大小的話,它所存在的場景比例就是固定的,此時的瞳距根據你想要的效果而定,具體可以在顯示器上測試。
當兩個攝像機的距離固定后,怎么把影像分開呢?因為我們用3d顯示器來融合,就不需要考慮unity的融合圖像部分,只需要把兩個相機的影像分為左右半寬同時輸出即可。要達到這樣的效果,用RenderTexture是個很好的解決方案,我們新建兩個RenderTexture,分別用來顯示左右兩個相機的視野:
把新建的兩個RenderTexture放到plane上,並排放到一起,並新建一個垂直攝像機來單獨顯示這兩個RenderTexture,這個攝像機也是我們最后看到的畫面所使用的相機。所以它的depth要設置的高一點。
關於RenderTexture,我們需要稍微調整一下,size改為2048*1024,注意不要改為2048*2048,即使這樣會更加清晰,但是會出現顯示不全的情況。注意,此時這兩個plane的scale大小只有設為2:1的比例才不會出現圖像變形,也就是說plane的大小要和RenderTexture的比例一樣才會顯示正常比例內容,但是我們需要的並不是正常比例,只要融合后是正常比例既可,顯示器的融合功能是將左右部分先放大到整個屏幕,再進行偏振融合,所以我們要的3d信號是壓縮一半之后的兩個影像,所以降2:1的比例壓縮后就成了1:1.也就是plane的大小還是1:1的方形,這樣在融合后才不會出現比例失真的情況。
大多數的3D顯示器的屏幕比例都是1920*1080,也就是16:9,現在的3D視頻分辨率大多也是這個比例,這樣在全屏的時候就不會變形或者出現黑邊,我們玩游戲全屏不失真的話,也要按這個比例(16:9),當然不全屏的話也是看不了3D的,因為左右半寬的窗體無法融合,3D顯示器也不認識這樣的3D信號。
再回到上面說的RenderTexture的大小(分辨率)問題上來,假如選擇了2048*2048,而game窗口比例又是16:9,unity的RenderTexture為了顯示1:1的比例,就把攝像機中間部分顯示出來,兩側內容裁減掉了,造成視野缺失,所以要選擇size為2048*1024,不過這樣又出新的問題,Game窗口是16:9,也就是攝像機視野比例是16:9,比2048*1024,也就是2:1的比例要小,造成RenderTexture兩側多顯示了一部分,這部分是左右相機視野中沒有的部分,必須要去掉的。去掉的方法其實很簡單,通過更改材質的UV值即可,也就是讓這兩個RenderTexture,顯示的影像往中間偏移,偏移的量,通過計算可以算出為0.05555…,我們改變UV偏移:
由於我們的攝像機視野時16:9,所以附有RenderTexture的plane的兩側內容並不在我們的視野內,這樣主相機的顯示影像只有左右相機的視野影像,不會有其他的內容.
到這里,我們在unity中要做的3D方面的操作已經差不多了,剩下的內容就是我們做普通游戲的流程,只要把我們曾經用的相機改為上面做的兩個相機即可,我們可以把這兩個相機連它們的父物體導出一個預制體,看向RenderTexture主相機和兩個附有RenderTexture的plane導出另一個預制體,這兩個預制體導出包package,這個package包就是一個轉3D立體游戲的插件了,要轉化哪個游戲為立體游戲,就把這個包導入,把兩個預制體拖進場景,把相機替換為左右兩個相機,然后導出游戲就是3d立體游戲了。
將導出的游戲(exe)打開,電腦要連好3D顯示器,這樣在選擇比例的時候才有1920*1080, Windowed的對號去掉,保證是全屏,導出設置里面也有默認全屏,
打開后,將顯示器改為3D模式,3D顯示器一般都有按鍵在下面或者側面,有轉換3D的功能鍵,打開后,帶上眼鏡就可以體驗3D立體效果了!
最終搞出來的效果:
注:假如感覺立體效果不明顯,就把兩個相機的距離拉開一點.