Camera類之orthographic-攝像機投影模式(第100篇隨筆)


這篇文章是我的第一百篇隨筆,算是一個里程碑吧。本科的時候就曾在CSDN上注冊了一個博客,但是一直沒有堅持下來去寫一些東西。研一上學期又在博客園上注冊了博客,很值得自豪,能夠堅持下來,將自己的學習心得、解題思路、生活情感在此分享。因為博客園主要分享的是技術文章,所以有關於個人情感的就很少寫了。好吧,開始正題了。

攝像機主要有兩種投影模式,一種是正交投影,一種是透視投影。

  1. 所謂投影就是將三維空間中的物體投影到二維平面上,例如在現實世界中攝像機拍攝物體,是由物體表面反射的光線經過凸透鏡聚到感光元件CCD單元上產生的。這就是把三維空間投影到二維空間的過程。
  2. 所謂正交投影,只考慮所有三維空間中的點的X和Y坐標,所有點映射到XY平面上。如果點(x,y,z)映射到點(x',y'),那么x = x',y = y'。每一個二維眼空間中的點都是和z軸是平行的直線在觀察平面上的投影。所以正交投影又叫平行投影。正交投影可以把場景中所有的物體通過平行光線投影到觀察平面上。在正交投影中,不管物體離眼睛有多遠,它都和原來的物體大小相同。
  3. 所謂透視投影,每一個點都映射到三維眼空間的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為負數時視口的內容會顛倒。效果如下:


免責聲明!

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



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