
유니티에서 Camera 컴포넌트를 자세히 들여다보면,
Field of View 옵션을 확인할 수 있다.
줄여서 FOV라고도 불리는 이것이 어떤 의미를 가지는지 알아보겠다.

일반적으로 FOV는 시야각을 정의하는 값인데, 이 값이 커질수록 넓은 범위를 화면에 담을 수 있다.
유니티 Camera 컴포넌트에서는 기본값이 60으로 설정되어있고, 수직 시야각(VFOV)을 의미한다.
아래의 이미지를 보자.

유니티에서는 FOV가 수직 시야각을 의미하기 때문에,
화면 세로 크기가 변경되더라도, 위아래 범위가 고정되어
물건의 크기가 커졌다 작아지는 것을 볼 수 있다.
일단, 수직 시야각은 FOV 그 자체인 것을 확인했다.
그렇다면 수평 시야각(HFOV)은 어떻게 구할 수 있을까?

수평 시야각은 화면 비율에 영향을 받는다.
화면 비율은 (가로 크기 / 세로 크기)로 구할 수 있다.
이 화면 비율을 FOV에 곱해주면 수평 시야각이 된다.
만약, 화면의 해상도가 1500x1000이면, 비율은 1.5이다.
이 때, FOV가 60이라면, 수평 시야각은 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를 사용하자.
'[Unity]' 카테고리의 다른 글
[Unity] 모바일 플랫폼의 터치 입력 처리하기 (63) | 2023.09.24 |
---|---|
[Unity] 코드 조각으로 빠르게 코딩하기 - Code Snippet (51) | 2023.09.23 |
[Unity] Windows 파일 드래그 앤 드롭 구현하기(Drag and Drop) (33) | 2023.09.10 |
[Unity] TextMeshPro용 상용 한글 2350자 + 영문 + 특수문자 (1) | 2023.09.03 |
[Unity] LeanTween을 활용한 부드러운 전환 효과 만들기 (0) | 2023.08.27 |
댓글