问题背景:

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中正面视图的相机最大距离定位的更多相关文章

  1. Unity中Oculus分屏相机和普通相机一键切换

    Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...

  2. Tips7:Unity中 Scene视图 和 Game视图 中 视角(Camera)的控制

    选中你要改变的相机,然后点击GameObject-->Align With View 选项(快捷键Ctrl+Shift+F)使相机视角和当前Sence视图中一样 通过这样可以控制在Game视图( ...

  3. 关于Unity中场景视图的使用

    1.在任何状态下,按下鼠标中键可以切换到手掌的那个状态,可以移动当前场景 2.在手掌的那个状态,按住鼠标左键是移动场景视图,右键是视角绕着摄像机移动,按住alt+鼠标左键,是绕着指定物体旋转视角 3. ...

  4. 介绍Unity中相机的投影矩阵与剪切图像、投影概念

    这篇作为上一篇的补充介绍,主要讲Unity里面的投影矩阵的问题: 上篇的链接写给VR手游开发小白的教程:(三)UnityVR插件CardboardSDKForUnity解析(二) 关于Unity中的C ...

  5. unity 中UGUI制作滚动条视图效果(按钮)

    1.在unity中创建一个Image作为滚动条视图的背景: 2.在Image下创建一个空物体,在空物体下创建unity自带的Scroll View组件: 3.对滑动条视图的子物体进行调整: 4.添加滚 ...

  6. Unity中几种简单的相机跟随

    #unity中相机追随 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collectio ...

  7. 【转】UNITY中相机空间,投影空间的正向问题

    原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...

  8. 如何在Unity中创造真实的水

    你将要创造什么 Unity是由Unity Technologies开发的多平台游戏引擎,用于为控制台,移动设备,计算机甚至网站等多种设备创建视频游戏和应用程序.Unity的核心优势在于其稳健性,可移植 ...

  9. Unity中容易被忽略的小技巧

    今天在游戏蛮牛上看到慕容小匹夫的一篇文章,感觉对自己现在的水平很实用,就给转载了过来,以便日后好温习一下. 这里还是要支持原创作者,原文地址在这里 一.编辑器染色 一个常见的工作情景是我们在调整场景内 ...

  10. 解读Unity中的CG编写Shader系列三

    转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...

随机推荐

  1. 热更学习笔记--toLau中lua脚本对C#中枚举和数组的访问

    [8]Lua脚本调用C#中的枚举学习 --调用枚举类型 print("----------------------toLua中调用C#中枚举类型----------------------- ...

  2. 如何部署ASP.NET Core到Linux服务器

    如何部署ASP.NET Core 到Linux服务器 我们开发的最终目的,是将开发后的东西发布网络上,以便自己及其他人使用. 本篇博客介绍如果在 linux 上部署 ASP.NET Core应用,使用 ...

  3. Java 创建/识别条形码

    项目刚好需要用到就记录一下 -- 依赖 <!-- 条形码生成 --><dependency> <groupId>net.sf.barcode4j</group ...

  4. CAD 标注镜像

    在代码里用镜像矩阵对标注进行镜像的时候,标注上面的文字也会被镜像掉,我在网上得到一个方法,可以解决这个问题.https://forums.autodesk.com/t5/net/dbtext-and- ...

  5. Qt-FFmpeg开发-音频解码为PCM文件(9)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm) 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-使用libavcod ...

  6. js 判断闰年

    首先,我们需要了解闰年的判断方式 1.能被4整除 2.并且不能被100整除 3.或者被400整除的 其次我们再来回顾下函数封装的知识,所谓的函数封装就是将一段函数封装成一个工具,有人用到了拿过来就可以 ...

  7. js 实现简易时钟效果

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...

  8. 判断是不是ie浏览器 加上ie11

    var b_version = navigator.appVersion; var version = b_version.split(";"); var trim_Version ...

  9. 未能加载文件或程序集“SissPayWebApi”或它的某一个依赖项。试图加载格式不正确

    "未能加载文件或程序集"xxx"或它的某一个依赖项.试图加载格式不正确的程序."这个错误可能在IIS或VS中出现,一般是平台和dll版本不一致导致的. 一.VS ...

  10. C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹体积很大

    现象:大量调用.p12证书时,C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹变得越来越大. 调用代码: X509Certificate2 x50 ...