透视相机的计算

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

如果我们需要在运行后按照宽度占满整个屏幕,那么是要移动相机位置或者调整场景位置,或者把相机对准后放好一个适当的距离然后调整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相关推荐

  1. 计算相机采集帧率C实现

    有关.h和.cpp文件(具体函数)见另一篇: 计算相机帧率 在回调函数中,下面的语句能够把帧数加一: //初始化参数,帧率加一pDlg->left.m_pCamsFps.IncreaseFram ...

  2. OpenCV - 计算相机和视频的帧速率FPS

    原文:OpenCV - 计算相机和视频的帧速率FPS[译] - AIUAI 原文:How to find frame rate or frames per second (fps) in OpenCV ...

  3. 如何通过图像消失点计算相机的位姿?

    论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...

  4. 计算相机投影矩阵(含代码)(Python)

    计算相机投影矩阵(含代码)(Python) 前几天处理点云时,需要使用到像片与3D点云的对应关系.在这边找了一圈没有发现直接可用的代码,于是去GitHub试了一下,以下是一个提炼后的矩阵计算代码. 下 ...

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

    前言 关于FOV FOV 是在任何给定时间通过人眼.相机取景器或在显示屏上可见的可观察世界的范围.它指的是整个区域的覆盖范围,而不是单个固定焦点.FOV 还描述了一个人可以看到可见世界的角度. FOV ...

  6. 基于SfM计算相机姿态

    具体过程为: ① 通过相机标定方法,预先计算相机的内参矩阵: ② 相邻帧特征点匹配,并结合内参矩阵计算本征矩阵: ③ 本征矩阵分解获得相机的外参矩阵[R | T],最终的相机移动距离等于矩阵T的Fro ...

  7. 如何使用图片的exif信息计算相机焦距

    在做三维重建和视觉测量的应用中,如果不想做复杂的相机标定,那么可以从图像的exif信息中获取相机的焦距信息.这里提供两种方法: 1.通过35mm等效焦距来计算: 图像的exif信息可以从图像的属性中获 ...

  8. 对于畸变较小的相机,如何简易计算相机参数

    一.前言 在很多图像处理中,需要使用相机参数来校正图像畸变.相机参数的获取往往需要复杂的标定过程,耗时耗力. 对于一些消费级相机,其本身畸变较小,可以人工计算理想模型下的参数来近似相机参数.我们就可以 ...

  9. 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 ...

最新文章

  1. CNI:容器网络接口
  2. 两个文件比对_Edlib:方便快速的长序列比对软件包
  3. 趣谈网络协议笔记-二(第十八讲)
  4. 免费学python的软件-初学python编程,有哪些不错的软件值得一用?
  5. 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
  6. 【学习笔记】22、读写文件(I/O操作)— 读文件
  7. llinux环境变量查看和修改
  8. android开发中的数据库SQLite的使用
  9. TensorFlow实验(1)
  10. PAT 1074. 宇宙无敌加法器(20)-PAT乙级真题
  11. 神经网络中的激活函数
  12. 学校计算机教师事迹材料,中学信息技术优秀教师事迹材料:信念在“用心”中闪光...
  13. 相机模型与坐标转换!
  14. 计算机isas测试,SAS硬盘测试:15,000转对决10,000转
  15. adb shell input keyevent 模拟按键事件
  16. 在线要饭源码 支付宝个人免签约支付
  17. 三、运算符 | Verilog
  18. zxing详细使用说明 java生成二维码、条形码
  19. 一个很好的ruby教程
  20. 统一用户权限管理系统 TDog7

热门文章

  1. android pcm转amr格式
  2. LED屏信息发布系统
  3. 情绪化进食对心血管的影响
  4. Java 多态-杂谈
  5. java计算器注释_java计算器实现,百行代码,清晰注释
  6. 【历史上的今天】12 月 17 日:词汇 Weblog 被创造;APL 语言发明人诞生;人类飞上天空
  7. 兰大计算机学院院长,兰州大学信息科学与工程学院
  8. 如何在Html5中画SVG(矢量图)
  9. scheduling Request(SR)
  10. 哈尔滨道外计算机初级培训班价格,哈尔滨办公自动化基础培训班费用