Camera类用来控制游戏中虚拟场景的展示,以左下角为屏幕的(0,0)点坐标,以右上角为屏幕的(camera.pixelWidth,camera.pixelHeight)点坐标。如果用单位化方式表示,则左下角为(0,0)点,右上角为(1,1)点。本博客主要介绍了Camera类的一些实例属性和实例方法,最后对摄像机的视口与aspect、pixelRect及rect之间的关系进行了注解。
文章目录
一、Camera类实例属性
在Camera类中,涉及的实力属性有aspect、cameraToWorldMatrix、cullingMask、eventMask、layerCullDistances、layerCullSpherical、orthographic、pixelRect、projectionMatrix、rect、renderingPath、targetTexture和worldToCameraMatrix。
1、aspect属性:设置摄像机视口比例
(1)基本语法
public float aspect { get; set; }
(2)功能说明
此属性用于获取或设置Camrea视口的宽高比例值。例如,设camera.aspect=2.0f,则camera视口的宽度/高度=2.0f,但是当硬件显示器屏幕的宽度与高度比例不为2.0f时,视图的显示讲会发生变形。aspect只处理摄像机Camera可以看到的视图的宽高比例,而硬件显示屏的作用只是把摄像机Camera看到的内容显示出来,当硬件显示屏的宽高比例与aspect的比例值不同时,视图讲发生变形
(3)代码实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Aspect_demo : MonoBehaviour
{
void Start()
{
//camera.aspect的默认值即为当前硬件的aspect值
Debug.Log("camera.aspect的默认值" + GetComponent<Camera>().aspect);
}
void OnGUI()
{
if (GUI.Button(new Rect(10.0f, 10.0f, 200.0f, 45.0f), "aspect=1.0f"))
{
//重置当前摄像机的aspect值
GetComponent<Camera>().ResetAspect();
GetComponent<Camera>().aspect = 1.0f;
}
if (GUI.Button(new Rect(10.0f, 60.0f, 200.0f, 45.0f), "aspect=2.0f"))
{
//重置当前摄像机的aspect值
GetComponent<Camera>().ResetAspect();
GetComponent<Camera>().aspect = 2.0f;
}
if (GUI.Button(new Rect(10.0f, 110.0f, 200.0f, 45.0f), "aspect还原默认值"))
{
//重置当前摄像机的aspect值
GetComponent<Camera>().ResetAspect();
}
}
}
这段代码中,首先在Start方法中打印出了Camera的默认aspect值,camera.aspect的默认值即为当前硬件的aspect值,若在Unity编辑模式中运行即为Game视图中aspect的值。然后再OnGUI方法中定义了3个Button来切换不同的aspect值,在每次设置新的aspect值之前,都需要先调用ResetAspect方法来重置视口的aspect值。
2、cameraToWorldMatrix属性:变换矩阵
(1)基本语法
public Matrix4x4 cameraToWorldMatrix { get; }
(2)功能说明
此属性的功能室返回从摄像机的局部坐标系到世界坐标系的变换矩阵(只读)
(3)代码实现
Notes:Camera中的forward方向为其自身坐标系的-z轴方向,一般其他GameObject对象的forward方向为自身坐标系的z轴方向
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraToWorldMatrix_demo : MonoBehaviour
{
void Start()
{
Debug.Log("Camera旋转前位置:" + transform.position);
Matrix4x4 m = GetComponent<Camera>().cameraToWorldMatrix;
//v3的值为沿着Camera局部坐标系的-z轴方向前移5个单位的位置在世界坐标系中的位置
Vector3 v3 = m.MultiplyPoint(Vector3.forward * 5.0f);
}
}