Unity中正面视图的相机最大距离定位
问题背景:
Unity中在场景中有这样的需求,就是俯视整个场景或者平视整个场景。这种情况下场景中物体长宽比不一定和相机视口长宽比一致,要保证所有的物体都在视口内,并且距离不能太远,,所以处理起来需要点手段。
原图场景:
Cube模拟场景外包盒:
效果如下:
效果一:

效果二:

正是这样,正好把相机卡到最大边,主要是物体长宽比和视口宽高比不一致,需要动态计算下这个比例。
分析草图:

代码如下:
1 /// <summary>
2 /// 俯视场景
3 /// </summary>
4 private void FuShiScene()
5 {
6 //效果一
7 //场景中物体外包盒的左下角和右上角坐标(测试定义数据,具体以实体物体(外包轮廓)为准),W>=L
8 // var upperbounds =new Vector3(3.0f,1.0f,6.0f);
9 // var lowerBounds = new Vector3(-3.0f, -1.0f, -6.0f);
10
11 //效果二
12 //场景中物体外包盒的左下角和右上角坐标(测试定义数据,具体以实体物体(外包轮廓)为准),L>=W
13 var upperbounds = new Vector3(2.0f, 1.0f, 3.0f);
14 var lowerBounds = new Vector3(-2.0f, -1.0f, -3.0f);
15
16 //外包盒(场景物体中心点)中心点
17 var center = (upperbounds + lowerBounds) * 0.5f;
18
19 //场景物体的外包盒尺寸(高宽长)
20 var heright = upperbounds.y - lowerBounds.y;
21 var width = upperbounds.z - lowerBounds.z;
22 var length = upperbounds.x - lowerBounds.x;
23
24 //场景外包盒顶端中心点
25 var upCenter = center + Vector3.up * 0.5f * heright;
26
27 //视口半角
28 float angle = Camera.main.fieldOfView * 0.5f * Mathf.Deg2Rad;
29
30 //向上偏移量
31 var offset = 0.0f;
32
33 //宽高比相同时(Camera.main.aspect 即 获取或者设置Camera视口的宽高比例值)
34 if ((length / width) == Camera.main.aspect)
35 {
36 offset = (width * 0.5f) / Mathf.Tan(angle);
37 }
38 else
39 {
40 //宽高比不一致的话,若长>宽,公式相机长宽比=外包盒长宽比,宽度指定不等同宽高比的宽,求动态宽
41 if (length >= width)
42 {
43 offset = (length / Camera.main.aspect) * 0.5f / Mathf.Tan(angle);
44 }
45 //宽高比不一致的话,若宽>=长,公式相机长宽比=外包盒长宽比,相机长>宽,实体长<宽,宽进来,总体就进来了,所以以宽为准
46 else
47 {
48 offset = (width) * 0.5f / Mathf.Tan(angle);
49 }
50 }
51
52 // 计算旋转(垂直)
53 var rotation = Quaternion.Euler(new Vector3(90.0f, 0.0f, 0.0f));
54
55 //求相机应当所处的目标位置
56 var position = upCenter - (rotation * Vector3.forward).normalized * offset;
57
58 // 更新位置
59 Camera.main.transform.position = position;
60 Camera.main.transform.rotation = rotation;
61 }
正视图也是如此思路,就实现了该功能。
Unity中正面视图的相机最大距离定位的更多相关文章
- Unity中Oculus分屏相机和普通相机一键切换
Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...
- Tips7:Unity中 Scene视图 和 Game视图 中 视角(Camera)的控制
选中你要改变的相机,然后点击GameObject-->Align With View 选项(快捷键Ctrl+Shift+F)使相机视角和当前Sence视图中一样 通过这样可以控制在Game视图( ...
- 关于Unity中场景视图的使用
1.在任何状态下,按下鼠标中键可以切换到手掌的那个状态,可以移动当前场景 2.在手掌的那个状态,按住鼠标左键是移动场景视图,右键是视角绕着摄像机移动,按住alt+鼠标左键,是绕着指定物体旋转视角 3. ...
- 介绍Unity中相机的投影矩阵与剪切图像、投影概念
这篇作为上一篇的补充介绍,主要讲Unity里面的投影矩阵的问题: 上篇的链接写给VR手游开发小白的教程:(三)UnityVR插件CardboardSDKForUnity解析(二) 关于Unity中的C ...
- unity 中UGUI制作滚动条视图效果(按钮)
1.在unity中创建一个Image作为滚动条视图的背景: 2.在Image下创建一个空物体,在空物体下创建unity自带的Scroll View组件: 3.对滑动条视图的子物体进行调整: 4.添加滚 ...
- Unity中几种简单的相机跟随
#unity中相机追随 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collectio ...
- 【转】UNITY中相机空间,投影空间的正向问题
原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...
- 如何在Unity中创造真实的水
你将要创造什么 Unity是由Unity Technologies开发的多平台游戏引擎,用于为控制台,移动设备,计算机甚至网站等多种设备创建视频游戏和应用程序.Unity的核心优势在于其稳健性,可移植 ...
- Unity中容易被忽略的小技巧
今天在游戏蛮牛上看到慕容小匹夫的一篇文章,感觉对自己现在的水平很实用,就给转载了过来,以便日后好温习一下. 这里还是要支持原创作者,原文地址在这里 一.编辑器染色 一个常见的工作情景是我们在调整场景内 ...
- 解读Unity中的CG编写Shader系列三
转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...
随机推荐
- Kubernetes(K8S)安装
Kubermetes (K8S) 安装 参考文档: 官方文档: https://kubernetes.io/zh-cn/docs/concepts/overview/components/#node- ...
- CentOS7部署ES(单机)
一.创建路径,解压 ## 创建路径 [root@localhost /]# cd /data [root@localhost data]# mkdir ES ## 解压 [root@localhost ...
- Java手机号校验规则最新
一.最新的Java手机号校验规则 在Java中,进行手机号校验通常使用正则表达式(Regex)来匹配手机号的格式.以下是一个基于当前(截至2024年)中国手机号规则的校验方法: 中国手机号通常以数字1 ...
- pytorch(GPU版)安装
确认有无英伟达显卡,有才能安装GPU版的pytorch,否则只能装CPU版 1.任务管理器->性能: 设备管理器->显示适配器,也可以: nvidia驱动安装地址(大部分电脑自带,不需要额 ...
- 一个IDEA界面如何同时打开多个项目
第一步:先导入其中一个工程 第二步:点击File->Project Structure 第三步:导入模块 最后点击Apply即可完成一个IDEA界面同时打开多个项目的需求.
- 最小生成树Kruskal算法的实现原理
到底什么是最小生成树 最小生成树算法应用范围比较广,例如在网络的铺设当中难免会出现环路,需要要生成树算法来取出网络中的环,防止网络风暴的发生.那到底什么是最小生成树呢?我这里就不给严谨的定义了,这种定 ...
- svn递归添加目录下面所有文件
进入根目录:$ svn add * --force A foo.c A somedir/bar.c A otherdir/docs/baz.doc
- Windows平台git clone文件路径太长报错
问题描述 在Windows下拉取一些比较大的开源项目经常会提示文件路径太长(filename too long),然后死活都不成功 解决办法 1.配置git git config --system c ...
- Linux signal()函数
这是在网易云课堂学习Linux下的signal()函数的笔记,课程链接:https://study.163.com/course/courseLearn.htm?courseId=1002913011 ...
- xv6 内存管理
前文讲述了 xv6 的启动过程,本文接着讲述 xv6 内存管理的部分,直接来看. 公众号:Rand_cs 启动部分完善 前文只是介绍了启动的过程,但是各类函数之间的调用,地址的变换,内存布局的变化并没 ...