유니티(Unity)에서 카메라 뷰 오브젝트 확인 함수 및 속성 모음(프러스텀, 렌더러, Bounds, 기타)

반응형

유니티(Unity)에서 카메라 뷰 오브젝트 확인 함수 및 속성 모음(프러스텀, 렌더러, Bounds, 기타) 

Renderer.isVisible

객체 및 렌더러가 카메라의 뷰 프러스트럼(시야 범위) 안에 있는지 확인합니다. 렌더러가 카메라에 의해 보일 때 true를 반환하고 그렇지 않으면 false를 반환합니다. 게임 오브젝트가 화면에 보일 때만 작업을 실행하고 싶을 때 사용
https://docs.unity3d.com/ScriptReference/Renderer-isVisible.html

 

 void Start()
    {
        m_Renderer = GetComponent<Renderer>();
    }

    void Update()
    {
        if (m_Renderer.isVisible)
        {
            Debug.Log("Object is visible");
        }
    
    }

 

Renderer.OnBecameVisible()

렌더러가 카메라의 뷰 프러스트럼 안에 들어갔을 때 호출되는 함수. 오브젝트가 처음으로 카메라에 보이게 되면 호출. 게임 오브젝트가 화면에 나타났을 때 이벤트 처리에 사용할수있음

void OnBecameVisible()
    {
        Debug.Log(gameObject.name + " is now visible.");
    }


https://docs.unity3d.com/ScriptReference/Renderer.OnBecameVisible.html?_ga=2.31967102.1568210274.1610360789-247112712.1600397187

 

 

Renderer.OnBecameInvisible()

렌더러가 카메라의 뷰 프러스트럼 밖으로 벗어났을 때 호출됩니다. 오브젝트가 더 이상 카메라에 보이지 않게 되면 호출.  게임 오브젝트가 화면에서 사라졌을 때의 처리에 사용할수있음

void OnBecameInvisible()
    {
        Debug.Log(gameObject.name + " is no longer visible.");
    }
https://docs.unity3d.com/ScriptReference/Renderer.OnBecameInvisible.html?_ga=2.29214844.1568210274.1610360789-247112712.1600397187


GeometryUtility.CalculateFrustumPlanes

카메라의 뷰 프러스트럼을 형성하는 6개의 평면(Planes)을 배열로 반환합니다.
[0] = Left, [1] = Right, [2] = Down, [3] = Up, [4] = Near, [5] = Far
https://docs.unity3d.com/ScriptReference/GeometryUtility.CalculateFrustumPlanes.html
뷰 프러스텀(Frustum)
https://docs.unity3d.com/6000.0/Documentation/Manual/UnderstandingFrustum.html

 



GeometryUtility.TestPlanesAABB

프러스텀 평면 배열과 축 정렬 바운딩 박스(AABB, Axis-Aligned Bounding Box)를 비교하여 해당 AABB가 카메라의 뷰 프러스트럼 안에 포함되는지 여부를 체크. Bounds가 평면 배열 내부에 있거나 교차하는 경우 true를 반환합니다.

https://docs.unity3d.com/ScriptReference/GeometryUtility.TestPlanesAABB.html

 

CalculateFrustrumPlanes함수와 함께 사용하여 렌더링 여부와 관계없이 카메라 뷰에 객체가 포함되어 있는지 여부를 확인할수있습니다. 카메라의 프러스텀 평면을 생성하고 타겟 오브젝트의 바운딩 박스(Bounds) 교섭상태를 체크합니다.


  void Start() 
    {
        cam = Camera.main;
        planes = GeometryUtility.CalculateFrustumPlanes(cam);
        objRenderer = GetComponent<Renderer>(); 
    }

    void Update()
    {
      
        if (GeometryUtility.TestPlanesAABB(planes, objRenderer.bounds))
        {
            Debug.Log(objRenderer.name + " has been detected!");
        }
        else
        {
            Debug.Log("Nothing has been detected");
        }
    }


Renderer.bounds

월드 공간에서 렌더러의 축 정렬 바운딩 박스(AABB, Axis-Aligned Bounding Box)를 반환합니다(객체를 완전히 둘러싼 바운딩 박스)
Renderer renderer =  GetComponent<Renderer>(); 
Bounds bounds = renderer.bounds;
https://docs.unity3d.com/ScriptReference/Renderer-bounds.html

 

bounds.center는 Transform.position보다 객체의 중심에 대한 더 정확한 근사치인 경우가 많음

Bounds bounds = renderer.bounds;

Debug.Log( bounds.center);
https://docs.unity3d.com/ScriptReference/Bounds-center.html

Mesh.bounds

Renderer.bounds와 유사하지만 로컬 공간에서의 bounds를 반환
https://docs.unity3d.com/ScriptReference/Mesh-bounds.html

 

Collider.bounds

물리적 충돌을 감지하는 영역을 정의하기 위한 컴포넌트인 콜라이드의 바운딩 박스를 반환. 충돌 검사와 물리적 상호작용에 사용
Collider collider = GetComponent<Collider>();
Bounds bounds = collider.bounds;
https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Collider-bounds.html

 


Camera.OnWillRenderObject()

컬링 프로세스 후 현재 카메라에서 객체가 표시된다고 간주되면 호출(객체가 표시되면 각 카메라에 대해 호출)
카메라가 오브젝트 렌더링을 시작하기 직전에 호출되는 이벤트 함수로 객체를 렌더링하는 카메라에 대한 준비 작업을 수행하는데 유용.
https://docs.unity3d.com/ScriptReference/Camera.OnWillRenderObject.html?_ga=2.100567902.1568210274.1610360789-247112712.1600397187

반응형

댓글

Designed by JB FACTORY