Width by camera distance

카메라와의 거리에 따라 카메라 폭을 구해보자.
예제 코드는 유니티 C#이다.

중학교때 삼각함수 공식을 배웠다. 

tan a = 높이 / 밑변
높이 = 밑변 * tan a 가 된다.

여기서 삼각함수의 값과 카메라를 일치 시키면 다음과 같다.

tan a = tan fov / 2
높이 = frustumHeight / 2 (h로 표시한다)
밑변 = camera distance (d로 표시한다)

즉, 식은 다음과 같다.

 h = d * tan a

식을 풀면 다음과 같다.

frustumHeight / 2 = d * tan fov * 0.5
frustumHeight = 2 * d * tan fov * 0.5

유니티의 Camera.fieldOfView는 Degree 단위이다. 계산 할때 Mathf.Deg2Rad를 이용해 라디안 값으로 바꿔야 한다. 유니티 코드로 바꾸면 다음과 같다.

frustumHeight = 2.0f * distance * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad)

frustumHeight와 카메라 Aspect를 알면 frustumWidth를 구할수 있다.

frustumWidth = frustumHeight * camera.aspect



var frustumHeight = 2.0f * distance * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
var frustumWidth = frustumHeight * camera.aspect;

Debug.Log("CameraWidth = " + frustumWidth + "  CameraHeight = " + frustumHeight);


참조)

https://i-msdn.sec.s-msft.com/en-us/windows/uwp/graphics-concepts/images/fovdiag.png
https://docs.unity3d.com/kr/current/Manual/FrustumSizeAtDistance.html
http://devkorea.co.kr/reference/Documentation/ScriptReference/Camera-fieldOfView.html