摄像机

作为一个游戏的必要元素,摄像机、光源、场景有着不可磨灭的作用。下面这几期聊一聊我的看法。

摄像机

玩家要体验制作好的游戏,首先要看到画面,摄像机就是这样的作用。在我看来,游戏和电影没什么区别,自然,摄像机把游戏世界呈现给了我们。比如我们要做第一人称游戏,那么摄像机就可以放在人物的头部,如果要做第三人称,那么就放在人物后面。。。。。诸如此类。再者我们平时玩游戏出现的小地图,其实也可以通过一个摄像机俯视游戏世界,获取玩家位置做标记来完成。下面通过实际操作来认识摄像机。

首先我们在new一个project,可以发现有一个主摄像机,观察它的Inspector
这里写图片描述
我们再create一个Empty对象,给这个对象添加组件Camera
这里写图片描述

可以看到
这里写图片描述
这个空对象也成为了摄像机,可以看出摄像机其实是一个组件。
至于如何在视图中看到物体,简单来说,只要把物体放在摄像头前就行。如何确定方位呢,很多人都会说,在这样一个3D世界,玩游戏都容易迷路,更何况游戏制作的时候呢,其实很简单,unity3d采取的是左手法则确定方位,我们可以在Scene的右上角看到一个世界坐标系
这里写图片描述

可以发现,摄像机也有Transform,还有一系列属性,可以看出,摄像机其实也是一个GameObject。下面介绍它的主要属性

属性参考链接:http://www.manew.com/thread-47076-1-1.html

或者下载课件http://ss.sysu.edu.cn/~pml/se347/2015sp/u3d/02-Unity%E5%B8%B8%E7%94%A8%E5%85%83%E7%B4%A0%E3%80%81%E7%89%A9%E7%90%86%E7%B3%BB%E7%BB%9F%E3%80%81%E7%B2%92%E5%AD%90%E7%B3%BB%E7%BB%9F.ppt

1.Clear Flags:清楚标记

  • Skybox: 屏幕中的空白部分用天空盒的内容填充,如果没有设置天空盒,则使用背景颜色。
  • Solid Color: 屏幕中的空白部分用背景颜色填充。
  • Depth only: 仅按照物体的前后遮挡关系来呈现结果。
  • Don’t Clear: 不清除任何颜色或深度缓存。结果是:每帧的呈现结果都叠加在一起。通常用于实现特殊的效果。

为了高度仿真,游戏可以加入天空元素,即天空盒,它是一个球体素材,需要在store中下载,然后将下载的资源import到porject中,在摄像机添加组件skybox,把资源拖入skybox中即可
这里写图片描述

2.Culling Mask

剔除遮罩。用于指定摄像机所作用的层(Layer)。

3.Field of View(FOV)

视野范围。只针对透视镜头,用于控制视角宽度与纵向角度。同上图此时FOV值为60,我们拖到10
这里写图片描述
可以这样理解,FOV值就是对镜头的缩放

4.Size

视口大小。只针对正交镜头,设定为相当于屏幕高度的一半。

5.Projection

分为透视(Perspective)和正交(Orthographic)
正交就是正交投影,三视图的关系,看到的物体是平面的,透视可以体现出物体间的远近,更能体现位置关系。两种投影都有不同的用处
我们再创建一个小球
这里写图片描述
透视图是这样的
这里写图片描述
可以感受到远近,而正交图
这里写图片描述
感觉像2D游戏。。。。。。

6.ClippingPlanes

表示摄像机的作用范围。只显示距离为[Near, Far]之间的物体。在此之外的无法看见

7.Viewport Rect

控制摄像机呈现结果对应到屏幕上的位置以及大小。屏幕坐标系:左下角是(0, 0),右上角是(1, 1)。绘制出来的都是矩形视图,通常可以用来作为副视图

8.Depth

当多个摄像机同时存在时,这个参数决定了呈现的先后顺序,值越大越靠后呈现。前面的会被后面呈现的覆盖

这两个属性我们用鸟瞰图来解释
将之前用空项目创建的摄像头放在两个物体上方,Rotation设为垂直向下
播放一次
这里写图片描述
为什么成这样了?我的天空呢,我的蓝色呢,其实就是Depth,我的main camera的Depth为-1,所以被覆盖了,修改后(比副摄像头大)可以看到天空又回来了,那么副摄像头呢?
先变回原样,副摄像头的Depth更大
将副摄像头的Viewport Rect设为(0.8, 0.8)(0.8,0.8)
这里写图片描述
鸟瞰图就出来了

Summary

Camera作为一个部件十分复杂,它的继承类树是这样的
这里写图片描述
只列出了部分变量和函数,详情可参考http://www.ceeger.com/Script/Camera/Camera.html

可以看出,Camera许多属性和方法其实都是来源于继承
而Object作为所有游戏元素的基类,自然也是Camera的基类。

Camera有很多静态属性
根据官网可查到,Camera的静态变量有以下:
* allCameras 返回所有可以使用的camera
* allCamerasCount 翻译场景中所有照相机的数量
* current 当前用于渲染的相机,只用于低级的渲染控制
* main 第一个被启用的Camera会被标记为main
* onPostRender 任何一个camera结束rendering都会触发的时间
* onPreCull 任何一个camera开始culling的时候触发的事件
* onPrerRender 任何一个camera在开始rendering之前都会触发的事件

我们可以通过程序来控制camera,首先重建一个project,创建三个摄像机,一个立方体和一个空对象用于挂载
这里写图片描述
在这里一个摄像头放得远,一个摄像头没有正对立方体,还有一个摄像头是鸟瞰
编写脚本CamerasControl

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CamerasControl : MonoBehaviour {
    private Camera MainCamera;
    private Camera CurrentCamera;
    private Camera[] Cameras;
    // Use this for initialization
    void Start () {
        MainCamera = Camera.main;//获取主摄像机
        Cameras = Camera.allCameras;//获取所有摄像机
        CurrentCamera = Camera.current;//获取当前摄像机
    }

    // Update is called once per frame
    void Update () {
        ChangeCamera();
    }

    void ChangeCamera()
    {
        // 点击1,2,3切换canmera,注意3个camera必须在同一个display下
        if (Input.GetKeyUp(KeyCode.Alpha1))
        {
            Cameras[0].enabled = true;
            Cameras[1].enabled = false;
            Cameras[2].enabled = false;
        }
        else if (Input.GetKeyUp(KeyCode.Alpha2))
        {
            Cameras[0].enabled = false;
            Cameras[1].enabled = true;
            Cameras[2].enabled = false;
        }
        else if (Input.GetKeyUp(KeyCode.Alpha3))
        {
            Cameras[0].enabled = false;
            Cameras[1].enabled = false;
            Cameras[2].enabled = true;
        }
        else if (Input.GetKeyUp(KeyCode.M))
        {
            //点击M后,所有camera设为false,除了主摄像机以外
            Cameras[0].enabled = false;
            Cameras[1].enabled = false;
            Cameras[2].enabled = false;
            MainCamera.enabled = true;
        }

    }
}

挂载到空对象,Run游戏
在键盘上按1是这样的
这里写图片描述
按2
这里写图片描述
按3
这里写图片描述

再来讲下如何用左手坐标系确定视图首先放置一个摄像头和立方体
这里写图片描述
其中摄像头散发出来的射线就是可视范围,我们点击世界坐标系的y
这里写图片描述
变成了这样,而y轴去哪了呢?可以这样简单理解,y轴的箭头方向从当前视角直戳我们的眼睛,此时修改摄像机Rotation的y值,就会绕y轴旋转,旋转正方向就是左手大拇指朝y轴正方向,手指弯曲方向为正方向,比如,修改y值为90,变成这样
这里写图片描述

摄像机还有很多好玩的属性,以后我会慢慢学习记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值