본문 바로가기
[Unity]

[Unity] FOV(Field of View)에 대해 알아보자

by 김기승 2023. 9. 17.

유니티에서 Camera 컴포넌트를 자세히 들여다보면,

Field of View 옵션을 확인할 수 있다.

 

줄여서 FOV라고도 불리는 이것이 어떤 의미를 가지는지 알아보겠다.


일반적으로 FOV는 시야각을 정의하는 값인데, 이 값이 커질수록 넓은 범위를 화면에 담을 수 있다.

유니티 Camera 컴포넌트에서는 기본값이 60으로 설정되어있고, 수직 시야각(VFOV)을 의미한다.

아래의 이미지를 보자.

유니티에서는 FOV수직 시야각을 의미하기 때문에,

화면 세로 크기가 변경되더라도, 위아래 범위가 고정되어

물건의 크기가 커졌다 작아지는 것을 볼 수 있다.

 

일단, 수직 시야각은 FOV 그 자체인 것을 확인했다.

그렇다면 수평 시야각(HFOV)은 어떻게 구할 수 있을까?

 

수평 시야각화면 비율에 영향을 받는다.

화면 비율은 (가로 크기 / 세로 크기)로 구할 수 있다.

화면 비율을 FOV에 곱해주면 수평 시야각이 된다.

 

만약, 화면의 해상도가 1500x1000이면, 비율은 1.5이다.

이 때, FOV60이라면, 수평 시야각은 90이 되는 것이다.

 

다른 예시로, 화면의 비율이 1:1(정사각형)이라면 수평 시야각이 FOV와 동일한 것이다.

 

VFOV(수직 시야각) = FOV
HFOV(수평 시야각) = FOV * 화면 비율

FOV의 의미를 알게되었으니 적절히 활용해보도록 하자.

이렇게, 큐브들이 놓인 공간 사이에서

 

카메라가 회전을 한다고 가정해보자.

 

using UnityEngine;

public class RotateCamera : MonoBehaviour
{
    public Camera cam;
    private Transform camTr;

    private void Start()
    {
        camTr = cam.transform;
    }
    private void Update()
    {
        camTr.eulerAngles += cam.fieldOfView * Time.deltaTime * Vector3.up; //FOV에 따라 속도 조절
    }
}

회전 코드는 위와 같다.

 

이 코드는 FOV 값이 작아져서 수직 시야각이 줄어들면, 회전 속도가 줄어든다.

 

하지만, 화면의 가로 크기가 작아진다고 속도가 줄어들지는 않는다.

좁은 화면에서는 천천히 회전하도록 해주어야 한다.

 

using UnityEngine;

public class RotateCamera : MonoBehaviour
{
    public Camera cam;
    private Transform camTr;

    private void Start()
    {
        camTr = cam.transform;
    }
    private void Update()
    {
        camTr.eulerAngles += cam.fieldOfView * cam.aspect * Time.deltaTime * Vector3.up; //HFOV에 따라 속도 조절
    }
}

이 때, 수평 시야각을 활용하는 것이다.

 

결과적으로, 화면 상태에 적절히 대응하는 속도를 지니게 되었다.

※ 매초 수평 시야각만큼 회전하는 것이다.


 

단순히 FOV를 Zoom In / Zoom Out 용도로만,

이해하는 개발자들이 있는 것 같아 글을 작성하게 되었다.

본인도 그랬다.

 

※ Camera.aspect는 Rect에 영향을 받으므로 순수한 화면 비율을 얻고자 하면,

Screen.width / Screen.height를 사용하자.

댓글