获取摄像机的视口区域
2017-08-02 本文已影响21人
OneMore2018
先上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class test : MonoBehaviour {
private Camera theCamera;
public float distance = 8.5f;
private Transform tran;
void Start () {
if(!theCamera)
{
theCamera = Camera.main;
}
//float temp = (float)Screen.width /(float) Screen.height;
//Debug.Log(temp);
//Debug.Log(theCamera.aspect );
tran = theCamera.transform;
// Debug.Log(theCamera.aspect);
}
void Update () {
FindCorners();
}
void FindCorners()
{
Vector3[] corner = GetCorners(distance);
Debug.DrawLine(corner[0],corner[1],Color.red);
Debug.DrawLine(corner[1], corner[3], Color.red);
Debug.DrawLine(corner[3], corner[2], Color.red);
Debug.DrawLine(corner[2], corner[0], Color.red);
}
Vector3[] GetCorners(float tempDistance)
{
Vector3[] corners = new Vector3[4];
// 角度转化为弧度(照相机视野的一半)
float halfOV = (theCamera.fieldOfView * 0.5f) * Mathf.Deg2Rad;
Debug.Log(halfOV);
float aspect = theCamera.aspect;
// 这里算出来的宽和高都是视口矩形的一半
float height = tempDistance * Mathf.Tan(halfOV);
float width = height * aspect;
// 左上
corners[0] = tran.position - (tran.right * width);
corners[0] += tran.up * height;
corners[0] += tran.forward * tempDistance;
// 右上
corners[1] = tran.position + (tran.right * width);
corners[1] += tran.up * height;
corners[1] += tran.forward * tempDistance;
// 左下
corners[2] = tran.position - (tran.right * width);
corners[2] -= tran.up * height;
corners[2] += tran.forward * tempDistance;
// 右下
corners[3] = tran.position + (tran.right * width);
corners[3] -= tran.up * height;
corners[3] += tran.forward * tempDistance;
return corners;
}
}
运行结果如下
Paste_Image.png这样就知道了摄像机的视口区域,接下来想做一些视口坐标的操作就简单了