原文链接:https://www.cnblogs.com/tgycoder/p/5074440.html
这篇文章是我的第一百篇随笔,算是一个里程碑吧。本科的时候就曾在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为负数时视口的内容会颠倒。效果如下:
写代码是一种艺术,甚于蒙娜丽莎的微笑。