Camera类之orthographic-摄像机投影模式


原文链接:https://www.cnblogs.com/tgycoder/p/5074440.html

这篇文章是我的第一百篇随笔,算是一个里程碑吧。本科的时候就曾在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为负数时视口的内容会颠倒。效果如下:

写代码是一种艺术,甚于蒙娜丽莎的微笑。
分类:  Unity3D

猜你喜欢

转载自blog.csdn.net/aaronmorgan/article/details/78727773