根据物体大小来计算相机的FOV

2024-03-30 16:08
文章标签 大小 计算 相机 物体 fov

本文主要是介绍根据物体大小来计算相机的FOV,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

透视相机的计算

游戏开发中会经常遇到把某个物体要放在相机视野内。可能是游戏的整个背景,如图:

在这里插入图片描述

如果我们需要在运行后按照宽度占满整个屏幕,那么是要移动相机位置或者调整场景位置,或者把相机对准后放好一个适当的距离然后调整Field of View (fov)就可以了,这个更简单些。

如果分辨率是固定的还好,但是在不同手机下分辨率,宽高比可能是不同的,如果不调整就要么会少显示一部分,要么露出边框了。

那么如何来计算fov呢?
我们先看看相机大概的样子
在这里插入图片描述
看图我们知道了,目标对象在Near Plane和Far Plane之间。如果要把目标物按宽度占满屏幕,可以看作已知View宽度,相机到View距离,求fov角的问题。根据三角形公式,
所以我们有如下代码可以计算。

public class CViewCameraTest : MonoBehaviour {public Camera mainCamera;	//相机public GameObject targetObject;	//显示的图片(场景)void Start () {}// Update is called once per framevoid Update () {//把目标物完全显示在相机范围内//把相机的位置放在固定位置mainCamera.transform.localPosition = new Vector3(0f, 0f, -10f);//mainCamera.aspect是当前相机视口的宽高比//targetObject.transform.localScale.x是物体的实际大小,这里面片是1米的float vheight = targetObject.transform.localScale.x / mainCamera.aspect; //计算锥体高度距离float distance = Vector3.Distance(mainCamera.transform.position, targetObject.transform.position);  //相机距离目标距离//根据对边和临边计算角度,并转化成角度float view = 2f * Mathf.Atan(vheight * 0.5f / distance) * Mathf.Rad2Deg;    //根据目标高度来计算mainCamera.fieldOfView = view;}
}

运行后。
在这里插入图片描述
在这里插入图片描述
不同的分辨率下也保持了宽度最大。

同样的,如果视口方和显示的对象forward一致,也可以让显示对象适应相机的视口大小,可以自由调整距离和fov来计算目标对象的大小。如下图:

在这里插入图片描述

		float distance = Vector3.Distance(mainCamera.transform.position, targetObject.transform.position);  //相机距离目标距离//计算视口高度和宽度float frustumHeight = 2.0f * distance * Mathf.Tan(mainCamera.fieldOfView * 0.5f * Mathf.Deg2Rad);float frustumWidth = frustumHeight * mainCamera.aspect;//缩放目标面片物体大小targetObject.transform.localScale = new Vector3(frustumWidth, frustumHeight,1f);

你拖动相机z的位置,和修改fov,呈现的内容不变。(当然对于Perspective透视相机你要把显示的对象放在正前方,光影会有变化。)

以此类推,你也可以根据物体大小来计算距离,可以通过
float distance = frustumHeight * 0.5f / Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);

正交相机的计算

对于Orthographic相机(正交相机)来说,计算可以这样。
首先计算出单位1米的orthographicSize 是多少,然后根据图片或者物体大小计算出真正大小,例如图片是2000的,PixelsPerUnit是100的,那么就是rate * (2000f/100)

        float rate = 1f / ((float)Screen.width / Screen.height) * 0.5f;    //1米的相机距离shapeCamera.orthographicSize = rate * ((float)headTexture.width / PixelsPerUnit);

这篇关于根据物体大小来计算相机的FOV的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861946

相关文章

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改