유니티
[Unity] 유니티 카메라 안에 오브젝트 판단 GetDistanceToPoint
Krapboss
2023. 11. 25. 18:09
Plane.GetDistanceToPoint
평면과 점의 최단 거리를 구한다.
* Plane의 Nomal로부터의 점과 최단 거리를 도출
* 부호가 있는 값을 도출, 해당 Plane의 법선 방향에 있는 오브젝트는 +, 그렇지 않은 오브젝트는 -를 반환
코드
//노말과 거리 값을 저장 구조
Plane[] plane =null;
void Start()
{
//카메라의 각 절두체를 얻어옵니다.
plane = GeometryUtility.CalculateFrustumPlanes(Camera.main);
}
private void OnDrawGizmos()
{
//값이 존재할 경우
if(plane !=null && plane.Length > 0)
{
Gizmos.color = Color.red;
Debug.Log(plane.Length);
for(int i = 0 ; i < plane.Length; i++)
{
Gizmos.DrawRay(transform.position,plane[i].normal * 3.0f);
}
}
}
View
- 카메라의 절두체의 평면 정보를 얻어와 평면 의 Normal 벡터와 Sphere 사이 거리 값을 곱해 화면 중앙에 표시한다.
코드
//노말과 거리 값을 저장 구조
Plane[] plane =null;
void Start()
{
//카메라의 각 절두체를 얻어옵니다.
plane = GeometryUtility.CalculateFrustumPlanes(Camera.main);
}
private void OnDrawGizmos()
{
//값이 존재할 경우
if(plane !=null && plane.Length > 0)
{
Gizmos.color = Color.red;
Debug.Log(plane.Length);
for(int i = 0 ; i < plane.Length; i++)
{
Gizmos.DrawRay(transform.position,plane[i].normal * 3.0f);
}
}
}
void Update()
{
for(int i = 0; i<plane.Length; i++)
{
if (plane[i].GetDistanceToPoint(go.transform.position) < 0f)
{
Debug.Log("문제가 생겼음");
//Start로 얻은 카메라의 절두체 정보값으로 그려줌
//만약 go오브젝트가 카메라 절두체 Normal에서 벗어났다면 파랑색으로 표시
Debug.DrawRay(transform.position, plane[i].normal *3.0f, Color.blue);
}
}
}
View1
[go 오브젝트 Sphere가 카메라 내부에 있는 경우]
View 2
[go 오브젝트 Sphere가 아래의 절두체 평면 바깥쪽이 있는 경우]
정리
- 해당 기능을 사용하여 만약 하나라도 카메라 절두체 평면 Normal과의 거리가 음수가 된다면
- .
- 오브젝트가 바깥쪽에 있다고 판단해서 Flase를 반환하면 된다.