在网上看了momo的文章,在这把代码加入些注释,也便于自己理解记忆。原理很简单,就是根据摄像机的参数计算距离摄像机某一距离的摄像机窗口四个position。
using UnityEngine;
using System.Collections;public class CameraView : MonoBehaviour {private Camera theCamera;//距离摄像机8.5米 用黄色表示public float upperDistance = 8.5f;//距离摄像机12米 用红色表示public float lowerDistance = 12.0f;private Transform tx;void Start (){if ( !theCamera ){theCamera = Camera.main;}tx = theCamera.transform;}void Update (){FindUpperCorners();FindLowerCorners();}void FindUpperCorners (){Vector3[] corners = GetCorners( upperDistance );// for debuggingDebug.DrawLine( corners[0], corners[1], Color.yellow ); // UpperLeft -> UpperRight Debug.DrawLine( corners[1], corners[3], Color.yellow ); // UpperRight -> LowerRightDebug.DrawLine( corners[3], corners[2], Color.yellow ); // LowerRight -> LowerLeftDebug.DrawLine( corners[2], corners[0], Color.yellow ); // LowerLeft -> UpperLeft}void FindLowerCorners (){Vector3[] corners = GetCorners( lowerDistance );// for debuggingDebug.DrawLine( corners[0], corners[1], Color.red );Debug.DrawLine( corners[1], corners[3], Color.red );Debug.DrawLine( corners[3], corners[2], Color.red );Debug.DrawLine( corners[2], corners[0], Color.red );}Vector3[] GetCorners ( float distance ){Vector3[] corners = new Vector3[ 4 ];float halfFOV = ( theCamera.fieldOfView * 0.5f ) * Mathf.Deg2Rad; //相机的垂直视野的float aspect = theCamera.aspect; //宽高比float height = distance * Mathf.Tan( halfFOV );//tan求出所求位置相机的高度float width = height * aspect; <span style="font-family: Arial, Helvetica, sans-serif;">//根据高度和aspect求出所求位置相机的宽度// UpperLeftcorners[ 0 ] = tx.position - ( tx.right * width );corners[ 0 ] += tx.up * height;corners[ 0 ] += tx.forward * distance;// UpperRightcorners[ 1 ] = tx.position + ( tx.right * width );corners[ 1 ] += tx.up * height;corners[ 1 ] += tx.forward * distance;// LowerLeftcorners[ 2 ] = tx.position - ( tx.right * width );corners[ 2 ] -= tx.up * height;corners[ 2 ] += tx.forward * distance;// LowerRightcorners[ 3 ] = tx.position + ( tx.right * width );corners[ 3 ] -= tx.up * height;corners[ 3 ] += tx.forward * distance;return corners;}
}