如圖,Unity的Camera的投影(Projection)設置有如下兩種,正交(Orthographic)和透視(Perspective)。
正交模式下的話,攝像機是以一個固定的大小(Size),平行觀察。被觀察的物體不會因離攝像機的遠近,而導致最終顯示在屏幕的大小位置不同。物體旋轉的話,在屏幕上的效果只會邊長或變短,並不會有前大後小的效果(2D效果)
透視模式下的話,攝像機是以一個角度(Field of View),擴散觀察。被觀察的物體會因離攝像機的遠近,而導致最終顯示在屏幕的大小位置不同。物體旋轉會有離攝像機近的部位顯示的偏大,遠的部位偏小的效果(3D效果)
這個時候,有一個問題是,在被觀察的物體不動的情況下,當我用正交攝像機投影出一個畫面的時候,此時將攝像機的投影模式改爲投影模式,該如何設置參數,從而保證看到的畫面不變。(實際情景是,FairyGUI的Stage Camera的正交攝像頭,但是美術那邊想要實現3D UI 的效果,所以想把Stage Camera改爲透視攝像頭,但是如何設置角度與位置使得UI可以完整的顯示在屏幕上)
我們可以看出透視攝像機在不同距離的橫切面是不同的屏幕大小,所以我們要找到其中一個距離的屏幕大小,正好和正交攝像機的屏幕大小一樣即可。
所以我們先要來了解下所謂的攝像機屏幕大小的概念Orthographic Size
Orthographic Size
在正交模式下,我們設置Size的值,攝像機的大小會隨之變動,那麼這個值和攝像機的大小是什麼關係呢?
簡單的理解就是,size的值是正交攝像機高度的一半。當你拉伸屏幕窗口的時候,攝像機的高度不變,寬度改變。比如,我們Size設置的爲7,表示屏幕的高度爲14unit。
我們可以通過建立幾個單位爲1unit的cube進行驗證,如圖,我們用七個單位爲1unit的cube,排成一排,正好是屏幕高度的一半。
知道Size的概念後,我們如果要使透視攝像機也一樣顯示Size=7的屏幕大小的話,只需要使得,當透視攝像機Field of View 爲α時,在距離x的情況下,橫切面的高度的一半爲7即可,如圖
根據三角函數我們可以得出 x = 7÷ tan(α÷2)
爲了方便計算,我們可以把Field of View設爲90度,則,tan45=1,所以我們只要將攝像機的z軸位置設置爲-7,即可達到和正交攝像機size=7時,一樣的屏幕效果(被觀察的物體z軸爲0)。