집게사장의 꿈

[Unity] 유니티 카메라 안에 오브젝트 판단 GetDistanceToPoint 본문

유니티

[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를 반환하면 된다.