根据物体大小来计算相机的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

相关文章

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

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

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc