一、Scene窗口利用Gizmos画出摄像机的视椎体
/**
*Copyright(C) 2019 by Lele Feng
*All rights reserved.
*ProductName: Unity Shaders Book
*FileName: GimosCameraRect.cs
*Author: Milk
*Version: 1.0
*UnityVersion:2017.1.1f1
*CreateTime: 2019/11/23 10:47:58
*Description:
*History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GimosCameraRect : MonoBehaviour
{
private Camera m_MainCamera;
private Camera MainCamera {
get
{
if (m_MainCamera == null)
{
m_MainCamera = Camera.main;
}
return m_MainCamera;
}
}
Vector3[] GetCameraVector(float dis)
{
Vector3[] vectorArr = new Vector3[4];
float aspect = MainCamera.aspect;
float height = Mathf.Tan(MainCamera.fieldOfView / 2 * Mathf.Deg2Rad) * dis;
float width = height * aspect;
Vector3 forward = transform.position + transform.forward * dis;
Vector3 right = transform.right * width;
Vector3 top = transform.up * height;
vectorArr[0] = forward + top - right;//top_left
vectorArr[1] = forward + top + right;//top_right
vectorArr[2] = forward - top + right;//bottom_right
vectorArr[3] = forward - top - right;//bottom_left
return vectorArr;
}
public void OnDrawGizmos()
{
Gizmos.color = Color.red;
Vector3[] farVecArr = GetCameraVector(MainCamera.farClipPlane);
Vector3[] nearVecArr = GetCameraVector(MainCamera.nearClipPlane);
Gizmos.color = Color.yellow;
Gizmos.DrawLine(nearVecArr[0], nearVecArr[1]);
Gizmos.DrawLine(nearVecArr[1], nearVecArr[2]);
Gizmos.DrawLine(nearVecArr[2], nearVecArr[3]);
Gizmos.DrawLine(nearVecArr[3], nearVecArr[0]);
Gizmos.DrawLine(farVecArr[0], farVecArr[1]);
Gizmos.DrawLine(farVecArr[1], farVecArr[2]);
Gizmos.DrawLine(farVecArr[2], farVecArr[3]);
Gizmos.DrawLine(farVecArr[3], farVecArr[0]);
Gizmos.color = Color.blue;
Gizmos.DrawLine(nearVecArr[0], farVecArr[0]);
Gizmos.DrawLine(nearVecArr[1], farVecArr[1]);
Gizmos.DrawLine(nearVecArr[2], farVecArr[2]);
Gizmos.DrawLine(nearVecArr[3], farVecArr[3]);
}
}
二、在Game窗口画出的摄像机视椎体脚本
/**
*Copyright(C) 2019 by Lele Feng
*All rights reserved.
*ProductName: Unity Shaders Book
*FileName: GimosCameraRect.cs
*Author: Milk
*Version: 1.0
*UnityVersion:2017.1.1f1
*CreateTime: 2019/11/23 10:47:58
*Description:
*History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GimosCameraRect : MonoBehaviour
{
private Camera m_MainCamera;
private Camera MainCamera
{
get
{
if (m_MainCamera == null)
{
m_MainCamera = Camera.main;
}
return m_MainCamera;
}
}
Vector3[] GetCameraVector(float dis)
{
Vector3[] vectorArr = new Vector3[4];
float aspect = MainCamera.aspect;
float height = Mathf.Tan(MainCamera.fieldOfView / 2 * Mathf.Deg2Rad) * dis;
float width = height * aspect;
Vector3 forward = transform.position + transform.forward * dis;
Vector3 right = transform.right * width;
Vector3 top = transform.up * height;
vectorArr[0] = forward + top - right;//top_left
vectorArr[1] = forward + top + right;//top_right
vectorArr[2] = forward - top + right;//bottom_right
vectorArr[3] = forward - top - right;//bottom_left
return vectorArr;
}
public void Update()
{
Vector3[] farVecArr = GetCameraVector(MainCamera.farClipPlane);
Vector3[] nearVecArr = GetCameraVector(MainCamera.nearClipPlane);
Debug.DrawLine(nearVecArr[0], nearVecArr[1], Color.yellow);
Debug.DrawLine(nearVecArr[1], nearVecArr[2], Color.yellow);
Debug.DrawLine(nearVecArr[2], nearVecArr[3], Color.yellow);
Debug.DrawLine(nearVecArr[3], nearVecArr[0], Color.yellow);
Debug.DrawLine(farVecArr[0], farVecArr[1], Color.yellow);
Debug.DrawLine(farVecArr[1], farVecArr[2], Color.yellow);
Debug.DrawLine(farVecArr[2], farVecArr[3], Color.yellow);
Debug.DrawLine(farVecArr[3], farVecArr[0], Color.yellow);
Debug.DrawLine(nearVecArr[0], farVecArr[0], Color.blue);
Debug.DrawLine(nearVecArr[1], farVecArr[1], Color.blue);
Debug.DrawLine(nearVecArr[2], farVecArr[2], Color.blue);
Debug.DrawLine(nearVecArr[3], farVecArr[3], Color.blue);
}
}