根据物体大小来计算相机的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相关推荐
- 计算相机采集帧率C实现
有关.h和.cpp文件(具体函数)见另一篇: 计算相机帧率 在回调函数中,下面的语句能够把帧数加一: //初始化参数,帧率加一pDlg->left.m_pCamsFps.IncreaseFram ...
- OpenCV - 计算相机和视频的帧速率FPS
原文:OpenCV - 计算相机和视频的帧速率FPS[译] - AIUAI 原文:How to find frame rate or frames per second (fps) in OpenCV ...
- 如何通过图像消失点计算相机的位姿?
论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...
- 计算相机投影矩阵(含代码)(Python)
计算相机投影矩阵(含代码)(Python) 前几天处理点云时,需要使用到像片与3D点云的对应关系.在这边找了一圈没有发现直接可用的代码,于是去GitHub试了一下,以下是一个提炼后的矩阵计算代码. 下 ...
- Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换
前言 关于FOV FOV 是在任何给定时间通过人眼.相机取景器或在显示屏上可见的可观察世界的范围.它指的是整个区域的覆盖范围,而不是单个固定焦点.FOV 还描述了一个人可以看到可见世界的角度. FOV ...
- 基于SfM计算相机姿态
具体过程为: ① 通过相机标定方法,预先计算相机的内参矩阵: ② 相邻帧特征点匹配,并结合内参矩阵计算本征矩阵: ③ 本征矩阵分解获得相机的外参矩阵[R | T],最终的相机移动距离等于矩阵T的Fro ...
- 如何使用图片的exif信息计算相机焦距
在做三维重建和视觉测量的应用中,如果不想做复杂的相机标定,那么可以从图像的exif信息中获取相机的焦距信息.这里提供两种方法: 1.通过35mm等效焦距来计算: 图像的exif信息可以从图像的属性中获 ...
- 对于畸变较小的相机,如何简易计算相机参数
一.前言 在很多图像处理中,需要使用相机参数来校正图像畸变.相机参数的获取往往需要复杂的标定过程,耗时耗力. 对于一些消费级相机,其本身畸变较小,可以人工计算理想模型下的参数来近似相机参数.我们就可以 ...
- Opencv计算相机响应函数(Camera Response Function)与Radiance
本文主要用于记录自己在学习CRF过程中遇到的一些问题. 两个论文截图 CRF模型 B = f ( V ( t ⋅ L ) ) B=f(V( t\cdot L)) B=f(V(t⋅L)) 其中 B B ...
最新文章
- CNI:容器网络接口
- 两个文件比对_Edlib:方便快速的长序列比对软件包
- 趣谈网络协议笔记-二(第十八讲)
- 免费学python的软件-初学python编程,有哪些不错的软件值得一用?
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
- 【学习笔记】22、读写文件(I/O操作)— 读文件
- llinux环境变量查看和修改
- android开发中的数据库SQLite的使用
- TensorFlow实验(1)
- PAT 1074. 宇宙无敌加法器(20)-PAT乙级真题
- 神经网络中的激活函数
- 学校计算机教师事迹材料,中学信息技术优秀教师事迹材料:信念在“用心”中闪光...
- 相机模型与坐标转换!
- 计算机isas测试,SAS硬盘测试:15,000转对决10,000转
- adb shell input keyevent 模拟按键事件
- 在线要饭源码 支付宝个人免签约支付
- 三、运算符 | Verilog
- zxing详细使用说明 java生成二维码、条形码
- 一个很好的ruby教程
- 统一用户权限管理系统 TDog7