45 lines
1.5 KiB
C#
45 lines
1.5 KiB
C#
using Cinemachine;
|
|
using RND;
|
|
using UnityEngine;
|
|
|
|
public class CameraFovCorrector : BaseCameraCorrector
|
|
{
|
|
private FovCorrector _data;
|
|
|
|
protected override void OnInit()
|
|
{
|
|
_data = new FovCorrector(VirtualCamera, VirtualCamera.m_Lens.FieldOfView);
|
|
}
|
|
|
|
public override void SyncCameraProperty(float widthOrHeight)
|
|
{
|
|
_data.SyncCameraFov(DefaultRatio, Camera.aspect, widthOrHeight);
|
|
}
|
|
|
|
private static float CalculateVerticalFov(float hFovInDeg, float aspectRatio)
|
|
{
|
|
float hFovInRads = hFovInDeg * Mathf.Deg2Rad;
|
|
float vFovInRads = 2 * Mathf.Atan(Mathf.Tan(hFovInRads / 2) / aspectRatio);
|
|
|
|
return vFovInRads * Mathf.Rad2Deg;
|
|
}
|
|
|
|
private class FovCorrector
|
|
{
|
|
private readonly float _defaultFov;
|
|
private readonly CinemachineVirtualCamera _virtualCamera;
|
|
|
|
public FovCorrector(CinemachineVirtualCamera camera, float defaultFov)
|
|
{
|
|
_virtualCamera = camera;
|
|
_defaultFov = defaultFov;
|
|
}
|
|
|
|
public void SyncCameraFov(float targetAspect, float cameraAspect, float widthOrHeight)
|
|
{
|
|
float horizontalFov = CalculateVerticalFov(_defaultFov, 1 / targetAspect);
|
|
float constantWidthFov = CalculateVerticalFov(horizontalFov, cameraAspect);
|
|
_virtualCamera.m_Lens.FieldOfView = Mathf.Lerp(constantWidthFov, _defaultFov, widthOrHeight);
|
|
}
|
|
}
|
|
} |