美文网首页unity
Unity基础(20)-Camera类

Unity基础(20)-Camera类

作者: 元宇宙协会 | 来源:发表于2018-08-30 16:15 被阅读2次

    1. 摄像机组件

    照相机是玩家观察世界的装置,屏幕空间点按像素定义,屏幕的左下为(0,0);右上是(pixelwidth,pixelHeight),z位置在照相机的世界单位中。

    相机组件
    Clear Flags :
    清除标识:确定了屏幕哪些部分将被清除,方便多个摄像机画不同的游戏元素
    Background:背景色
    Culling Mask:包含或省略要由相机呈现的对象层。在检查器中将图层分配给您的对象。
    Projection:  切换相机的功能来模拟透视。
        Perspective(透视):  相机将完整地呈现透视物体。拍摄角度为0-180°(最高)
    Field of View: 设置为“正交”时,“相机”的视口大小。
    Orthographic(正交):  相机将统一渲染对象,没有视角。注:正交模式下不支持延迟渲染。正向渲染总是被使用。
    Size:设置为“正交”时,“相机”的视口大小。
    Cliping Planes:从相机到开始和停止渲染的距离。
         Near :相对于相机的最近点将出现绘图。
         Far  :相对于相机的最远点将出现绘图。
    ViewportRect:视口矩形 四个值指示屏幕上的相机视图将被绘制的位置。在视口坐标中测量(值为0-1)。
    Depth:相机的位置按照画图顺序。具有较大值的相机将被绘制在具有较小值的相机之上。
    Rendering Path:用于定义相机将使用什么渲染方法的选项
        渲染路径 :定义什么绘制方法被用于相机的选项
        Use Graphics Settings 使用玩家设置:在玩家设置(Player Settings.)相机使用哪个渲染路径。 
         Forward 正向渲染:所有对象每材质渲染只渲染一次,快速渲染
         Deferred 延迟照明:所有物体将在无光照的环境渲染一次,然后在渲染队列尾部将物体的光照一起渲染出来。
        Legacy Vertex Lit 顶点光照 :所有被这个相机渲染的物体都将渲染成Vertex-Lit物体。
        Legacy Deferred : 旧的延迟光照 
    Target Texture : 目标纹理:渲染纹理 (Render Texture)包含相机视图输出。这会使相机渲染在屏幕上的能力被禁止。可用于实现画中画或者画面特效。
    Occlusion Culling : 是否剔除物体背向摄像机的部分
    Allow HDR:高动态光照渲染,启动相机高动态范围渲染功能。让场景更真实。
    Allow MSAA: 这台相机应该使用MSAA渲染目标吗?如果当前质量设置MSAA级别支持,将只使用MSAA。
    Allow Dynamic Resolution:动态分辨率缩放。
    如果相机使用动态分辨率渲染,则为true,否则为false。即使此属性为true,动态分辨率也只能在当前图形设备支持的情况下使用。
    Target Display:设置此摄像机的目标显示。
    此设置使摄像机呈现在指定的显示中。显示器(例如监视器)支持的最大数目是8. 
    
    
    Clear Flags
    Clear Flags :
    清除标识:确定了屏幕哪些部分将被清除,方便多个摄像机画不同的游戏元素
    Skybox  :
    天空盒:这是默认设置。屏幕上的任何空的部分将显示当前相机的天空盒。
    如果当前的相机没有设置天空盒,它会默认在渲染设置(Render Settings )选择天空盒
    Solid Color :
    纯色,屏幕上的空白部分将显示当前摄像机的背景色
    Depth Only :
    深度相机,只渲染采集到的画面
    如果你想绘制一个玩家的枪,又不让它内部环境被裁剪,你会设置深度为0的相机绘制环境,
    和另一个深度为1的相机单独绘制武器。武器相机的清除标志(Clear Flags )应设置 为depth only。
    Don't Clear :
    不清除,此模式不清除颜色或深度缓存。每帧的渲染画面叠加在上一帧画面之上。
    
    Culling Mask
    Culling Mask:包含或省略要由相机呈现的对象层。在检查器中将图层分配给您的对象。
    Nothing:什么层都不剔除
    Everything:什么层都剔除
    Default:默认层剔除
    TransparentFX:隐形层,系统不会渲染贴图和模型
    Ignore Raycast:射线层剔除
    Water:水层剔除
    UI:UI层剔除
    
    Rendering Path
    Rendering Path:用于定义相机将使用什么渲染方法的选项
    渲染路径 :定义什么绘制方法被用于相机的选项
    Use Graphics Settings 使用玩家设置:在玩家设置(Player Settings.)相机使用哪个渲染路径。 
      Forward 正向渲染:所有对象每材质渲染只渲染一次,快速渲染
      Deferred 延迟照明:所有物体将在无光照的环境渲染一次,然后在渲染队列尾部将物体的光照一起渲染出来。
    Legacy Vertex Lit 顶点光照 :所有被这个相机渲染的物体都将渲染成Vertex-Lit物体。
    Legacy Deferred : 旧的延迟光照 
    Traget Texture 目标纹理:渲染纹理 (Render Texture)包含相机视图输出。
    这会使相机渲染在屏幕上的能力被禁止。可用于实现画中画或者画面特效与
    Occlusion Culling : 是否剔除物体背向摄像机的部分
    Allow HDR:高动态光照渲染,启动相机高动态范围渲染功能。让场景更真实。
    Allow MSAA: 这台相机应该使用MSAA渲染目标吗?如果当前质量设置MSAA级别支持,将只使用MSAA。
    Allow Dynamic Resolution:动态分辨率缩放。
    如果相机使用动态分辨率渲染,则为true,否则为false。即使此属性为true,动态分辨率也只能在当前图形设备支持的情况下使用。
    Target Display:设置此摄像机的目标显示。
    此设置使摄像机呈现在指定的显示中。显示器(例如监视器)支持的最大数目是8. 
    

    2. Camera实例

    • aspect : 获取或者设置Camera视口的宽高比例值。例如:camera.aspect =2.0f,则视口的宽度、高度 = 2.0f,当硬件显示器屏幕的宽度与高度比例不为2.0f时,视图的显示将会发生变形。aspect只处理摄像机camera可以看到的视图的宽高比例,而硬件显示屏的作用只是把摄像机camera看到的内容显示出来,当硬件显示屏的宽高比例与aspect的比例值不同时,视图将发生变形。
    using UnityEngine;
    
    public class aspect : MonoBehaviour {
    
        void Start () {
            Debug.Log("默认值" + Camera.main.aspect);
        }
        private void OnGUI()
        {
            if (GUI.Button(new Rect(10f, 10f, 200f, 45f), "aspect = 1.0"))
            {
                Camera.main.ResetAspect();
                Camera.main.aspect = 1.0f;
            }
    
            if (GUI.Button(new Rect(10f, 60f, 200f, 45f), "aspect = 2.0"))
            {
                Camera.main.ResetAspect();
                Camera.main.aspect = 2.0f;
            }
            if (GUI.Button(new Rect(10f, 110f, 200f, 45f), "aspect = 3.0"))
            {
                Camera.main.ResetAspect();
                Camera.main.aspect = 3.0f;
            }
            if (GUI.Button(new Rect(10f, 160f, 200f, 45f), "aspect = 0.0"))
            {
                Camera.main.ResetAspect();
            }
        }
    }
    
    • cameraToWorldMatrix : 变换矩阵
    using UnityEngine;
    
    public class cameratoworldmatrix : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
            Debug.Log("Camera旋转前位置" + transform.position);
            Matrix4x4 m = Camera.main.cameraToWorldMatrix;
            // 向量的位置转换为世界坐标中的位置
            //v3 的值为沿着Camera局部坐标系的-z轴方向前移5个单位的位置在世界坐标系中的位置
            Vector3 v3 = m.MultiplyPoint(Vector3.forward * 5.0f);
            //v4 的值为沿着Camera世界坐标系的-z轴方向前移5个单位的位置在世界坐标系中的位置
            Vector3 v4 = m.MultiplyPoint(transform.forward * 5.0f);
            Debug.Log("旋转前,V3坐标值:"+v3);
            Debug.Log("旋转前,V4坐标值:"+v4);
            // 将摄像机沿着Y轴正向旋转90度(此时摄像机局部坐标系的z轴方向和世界坐标的X轴方向一致),
            transform.Rotate(Vector3.up * 90f);
            m = Camera.main.cameraToWorldMatrix;
            v3 = m.MultiplyPoint(Vector3.forward * 5.0f);
            v4 = m.MultiplyPoint(transform.forward * 5.0f);
            Debug.Log("旋转后, v3坐标值"+v3);
            Debug.Log("旋转后, v4坐标值"+v4);
        }
    }
    
    • CullingMask 按层渲染,此属性用于按层(GameObject.layer)有选择性地渲染场景中的物体。通过cullingMask可以使得当前摄像机有选择性地渲染场景中的部分物体,默认cullingMask =-1即渲染场景中的任何物体,cullingMask = 0时不渲染场景中的任何物体。若只渲染2,3,4,可以使用cullingMask = (1<<2)+ (1<<3)+(1<<4)来进行。
    using UnityEngine;
    
    public class cullingMask : MonoBehaviour {
    
        void Start () {
            Debug.Log("默认值" + Camera.main.aspect);
        }
        private void OnGUI()
        {
            if (GUI.Button(new Rect(10f, 10f, 200f, 45f), "CullingMask = -1"))
            {
                Camera.main.cullingMask = -1;
            }
    
            if (GUI.Button(new Rect(10f, 60f, 200f, 45f), "CullingMask = 0"))
            {
               Camera.main.cullingMask = 0;
            }
            if (GUI.Button(new Rect(10f, 110f, 200f, 45f), "aspect = 3.0"))
            {
                Camera.main.cullingMask =1 << 0;
            }
            if (GUI.Button(new Rect(10f, 160f, 200f, 45f), "aspect = 1<<8"))
            {
                Camera.main.cullingMask =1 << 8;
            }
             //渲染第8层与第0层
           if (GUI.Button(new Rect(10f, 160f, 200f, 45f), "aspect = 0&&8"))
            {
                // 注意运算符优先排序
                Camera.main.cullingMask =1+(1 << 8);
            }
        }
    }
    
    • eventMask属性:按层响应事件,选择哪个层(layer)的物体可以响应鼠标事件

    1.必须满足两个条件:

    • 1.物体在摄像机的视野范围内。
    • 2.在2的layer次方的值与eventMask进行运算(&)后结果仍为2的layer次方的值,如:defalult ,layer值为0,2的0次方=1,如果1与eventMask进行与运算后扔为1,则此物体响应鼠标事件。由于EventMask为奇数时,与1的与运算结果都为1,所以若物体层为defalut并且eventMask为奇数时物体会响应鼠标事件。

    2.如果想要多个不同层的物体响应鼠标事件,则需要把所有层的2的layer次方值相加,再与eventMask做与运算。例如,2个物体,layer值分贝为1,3,当event与9进行与运算后结果仍为9,则这两个物体都会响应鼠标事件。

    3.此属性有一个特殊情况,但固体layer选择IgnoreRaycast(其为系统内置,值为2)时,无论EventMask值为多少,物体都无法响应鼠标事件。

    
    

    相关文章

      网友评论

        本文标题:Unity基础(20)-Camera类

        本文链接:https://www.haomeiwen.com/subject/ekqdwftx.html