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)}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值