您现在的位置是:首页 >技术杂谈 >Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换网站首页技术杂谈

Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换

Lawa0592 2024-06-17 10:13:16
简介Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换

前言

关于FOV
FOV 是在任何给定时间通过人眼、相机取景器或在显示屏上可见的可观察世界的范围。它指的是整个区域的覆盖范围,而不是单个固定焦点。FOV 还描述了一个人可以看到可见世界的角度。
FOV 越宽,可以看到的可观察世界就越多。它是水平、垂直和对角线测量的。相机镜头、其焦距和传感器尺寸都在确定 FOV 方面发挥作用。
FOV一般可以分为三种类型, 分别是对角线FOV ,垂直FOV, 水平FOV
在这里插入图片描述
在Unity中的相机属性里,可以对相机的视野轴进行设置,详见:Camera component

FOV Axis (when Perspective is selected)视野轴
Horizontal摄像机使用水平视野轴
Vertical摄像机使用垂直视野轴

在这里插入图片描述
在这里插入图片描述
但是需要注意的是,如果通过代码对相机的Camera.fieldOfView进行赋值,是对相机的垂直FOV进行赋值。也就是说尽管在Camera的属性里设置了使用水平视野轴,通过代码赋值的话需要自行进行计算转换来赋值。
在这里插入图片描述

如何将水平FOV转垂直FOV

  • 方法1:手动计算(适用任何情况的FOV转换)
	/// <summary>
    /// 将垂直FOV转成水平FOV
    /// </summary>
    /// <param name="verFOV">垂直FOV值</param>
    /// <param name="aspect">屏幕分辨率比例</param>
    /// <returns></returns>
    public static float ConvertVerticalFOVToHorizontally(float verFOV, float aspect)
    {
        // 垂直fov角度转成弧度
        float verFovRadian = verFOV * Mathf.Deg2Rad;
        // 算出视野高度的一半
        float camHalfHeight = Mathf.Tan(verFovRadian / 2);
        // 算出水平视野的弧度
        float horFOVRadian = Mathf.Atan(camHalfHeight * aspect) * 2;
        // 将水平视野弧度转成角度
        float horFOV = horFOVRadian * Mathf.Rad2Deg;

        return horFOV;
    }
  • 方法2:UnityEngine.Camera类提供api(适用于Unity内)
	/// <summary>
    /// 将垂直FOV转成水平FOV
    /// </summary>
    /// <param name="verFOV">垂直FOV值</param>
    /// <param name="aspect">屏幕分辨率比例</param>
    /// <returns></returns>
    public static float ConvertVerticalFOVToHorizontally(float verFOV, float aspect)
    {
        return Camera.VerticalToHorizontalFieldOfView(verFOV, aspect)}

如何将垂直FOV转水平FOV

  • 方法1:手动计算(适用任何情况的FOV转换)
	/// <summary>
    /// 将水平FOV转成垂直FOV
    /// </summary>
    /// <param name="horFOV">水平FOV</param>
    /// <param name="aspect">屏幕分辨率比例</param>
    /// <returns></returns>
    public static float ConvertHorizontalFOVToVertically(float horFOV, float aspect)
    {
        // 水平fov角度转成弧度
        float horFOVRadian = horFOV * Mathf.Deg2Rad;
        // 算出视野宽度的一半
        float camHalfWidth = Mathf.Tan(horFOVRadian / 2);
        // 算出垂直视野的弧度
        float verFOVRadian = Mathf.Atan(camHalfWidth / aspect) * 2;
        // 将垂直视野弧度转成角度
        float verFOV = verFOVRadian * Mathf.Rad2Deg;
        
        return verFOV;
    }
  • 方法2:UnityEngine.Camera类提供api(适用于Unity内)
	/// <summary>
    /// 将水平FOV转成垂直FOV
    /// </summary>
    /// <param name="horFOV">水平FOV</param>
    /// <param name="aspect">屏幕分辨率比例</param>
    /// <returns></returns>
    public static float ConvertHorizontalFOVToVertically(float horFOV, float aspect)
    {
        return Camera.HorizontalToVerticalFieldOfView(horFOV, aspect)}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。