1. 程式人生 > 其它 >Unity 判斷2D/3D座標系下的一個點是否在指定的攝像機視野範圍內

Unity 判斷2D/3D座標系下的一個點是否在指定的攝像機視野範圍內

 1 using UnityEngine;
 2 
 3 public partial class CommonFunction
 4 {
 5     /// <summary>
 6     /// 視口座標系是將Game檢視的螢幕座標系單位化,左下角(0,0),右上角(1,1)
 7     /// 攝像機視口座標系下的座標範圍
 8     /// </summary>
 9     static Rect viewRect = new Rect(0, 0, 1, 1);
10 
11     /// <summary>
12     /// 以Game檢視為準
13     /// 判斷2D座標系下的一個點是否在指定的攝像機視野範圍內
14 /// 忽略z軸 15 /// </summary> 16 /// <param name="camera"></param> 17 /// <param name="uiWorldPos"></param> 18 /// <returns></returns> 19 public static bool Is2DPointInsideCameraView(Camera camera, Vector3 uiWorldPos) 20 { 21 if (null == camera)
22 { 23 return false; 24 } 25 26 Vector3 viewPos = camera.WorldToViewportPoint(uiWorldPos); 27 return viewRect.Contains(viewPos); 28 } 29 30 /// <summary> 31 /// 以Game檢視為準 32 /// 判斷3D座標系下的一個點是否在指定的攝像機視野範圍內 33 /// </summary> 34 /// <param name="camera"></param>
35 /// <param name="worldPos"></param> 36 /// <returns></returns> 37 public static bool Is3DPointInsideCameraView(Camera camera, Vector3 worldPos) 38 { 39 if (null == camera) 40 { 41 return false; 42 } 43 44 //獲取攝像機的六個平面 45 Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera); 46 for (int i = 0, iMax = planes.Length; i < iMax; ++i) 47 { 48 //判斷一個點是否在平面的正方向 49 if (!planes[i].GetSide(worldPos)) 50 { 51 return false; 52 } 53 } 54 55 return true; 56 } 57 }