這篇文章是我的第一百篇隨筆,算是一個里程碑吧。本科的時候就曾在CSDN上注冊了一個博客,但是一直沒有堅持下來去寫一些東西。研一上學期又在博客園上注冊了博客,很值得自豪,能夠堅持下來,將自己的學習心得、解題思路、生活情感在此分享。因為博客園主要分享的是技術文章,所以有關於個人情感的就很少寫了。好吧,開始正題了。
攝像機主要有兩種投影模式,一種是正交投影,一種是透視投影。
- 所謂投影就是將三維空間中的物體投影到二維平面上,例如在現實世界中攝像機拍攝物體,是由物體表面反射的光線經過凸透鏡聚到感光元件CCD單元上產生的。這就是把三維空間投影到二維空間的過程。
- 所謂正交投影,只考慮所有三維空間中的點的X和Y坐標,所有點映射到XY平面上。如果點(x,y,z)映射到點(x',y'),那么x = x',y = y'。每一個二維眼空間中的點都是和z軸是平行的直線在觀察平面上的投影。所以正交投影又叫平行投影。正交投影可以把場景中所有的物體通過平行光線投影到觀察平面上。在正交投影中,不管物體離眼睛有多遠,它都和原來的物體大小相同。
- 所謂透視投影,每一個點都映射到三維眼空間的Z = 1的平面上,它是這個點和原點的連線與Z = 1平面的交點。二維眼空間中的每個點表示該點與三維眼空間的原點生成的直線。
如下圖所示:
在Unity中,Camera類的orthographic屬性就是用於設置和獲取當前攝像機的投影模式。其原型為:
public bool orthographic {get;set;}
若值為true則為正交投影,反之為透視投影。在正交投影模式下,物體在視口的大小只與正交視口的大小有關,與攝像機到物體的距離無關,主要用來呈現2D效果。在透視模式下,物體在是口重的大小與攝像機的視口夾角(fieldOfView)以及攝像機與物體的距離都有關系,有遠小近大的效果,主要用來呈現3D效果。
下面給出一個“小栗子”來模擬一下兩種投影模式。
using UnityEngine; using System.Collections; public class TestOrthogra: MonoBehaviour { public Transform cb1; float len = 5.5f; // Use this for initialization void Start () { float[] distances = new float[32]; distances[8] = Vector3.Distance(transform.position, cb1.position); camera.layerCullDistances = distances; } // Update is called once per frame void Update () { //transform.Translate(transform.right * Time.deltaTime); } void OnGUI() { if (GUI.Button(new Rect(10.0f, 10.0f, 120.0f, 45.0f), "正交投影")) { camera.orthographic = true; len = 5.5f; } if(GUI.Button(new Rect(150.0f,10.0f,120.0f,45.0f),"透視投影")) { camera.orthographic = false; len = 60.0f; } if(camera.orthographic) { len = GUI.HorizontalSlider(new Rect(10.0f, 60.0f, 300.0f, 45.0f), len, -20.0f, 20.0f); camera.orthographicSize = len; } else { len = GUI.HorizontalSlider(new Rect(10.0f, 60.0f, 300.0f, 45.0f), len, 1.0f, 179.0f); camera.fieldOfView = len; } GUI.Label(new Rect(320.0f, 60.0f, 120.0f, 45.0f), len.ToString()); } }
將該腳步添加到場景中的攝像機即可,如下圖所示:
需要說明一點,在正交模式下物體沒有遠大近小的效果,並且Camera的OrthographicSize的大小也沒有限制。但是當orthographicSize為負數時視口的內容會顛倒。效果如下: