问题背景:

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. C#/C++ 通过ODBC连接OceanBase Oracle租户

    概述 近期我们项目正处于将Oracle数据库迁移到OceanBase Oracle租户模式的阶段.考虑到我们项目采用了C++和C#混合开发,并且使用了多种技术,因此存在多种数据库连接方式.然而,针对C ...

  2. 记录Notion API Authorization中的一个坑

    正文 Notion官方文档的Authorization部分提到: In your integration code, include the token in the Authorization he ...

  3. 用 Certbot-auto 在 letsencrypt.org申请免费 SSL 证书实现 HTTPS

    参考帖子 https://www.cnblogs.com/lzpong/p/6433189.html https://www.cnblogs.com/756623607-zhang/p/1163850 ...

  4. Linux-0.11操作系统源码调试

    学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,<操作系统真相还原>.<Orange's:一个操作系统的实现>等书就是教学这个的:另一种方式就是调试操作系统 ...

  5. k8s快捷命令

    查看node使用率: for i in `kubectl get nodes|awk '{print $1}'|sed '1d'`;do  echo "=========>" ...

  6. WPF没修改代码出现InitializeComponent报错的解决办法

    问题不在于我们做错了什么,之前还好好的,我们什么都没做,就报错了.这完全不是我们的问题. 我的建议是,直接做绝一点,删除obj和debug文件夹,让他自己重新生成一次

  7. 【超强SQL】WordPress批量修改指定分类下所有文章状态

    前阵子主题君的某一个手游下载站的某一个分类,被百度K了,导致整个分类的文章收录都没了,这时候如果想要回复权重,就需要把这个分类的文章都删除了. 下面主题君给大家分享一段巨牛逼的SQL, WordPre ...

  8. vue4 项目的创建

    1,安装vue cli 脚手架,是全局安装npm install -g @vue/cli 可以在输出信息中看到安装位置,例如:C:\Users\xiaochangjian\AppData\Roamin ...

  9. 如果个人pc上要装不同社区版本的pycharm,安装时需要注意的一点

    pycharm下载地址[包含了目前发行的所有版本]:https://www.jetbrains.com/pycharm/download/other.html 选择指定的版本,点击 勾选uninsta ...

  10. 一个免费、时尚、强大的 Windows GitHub 客户端

    前言 今天大姚给大家分享一个.NET开源(MIT License).免费.时尚.功能强大的 Windows GitHub 客户端:FluentHub. 工具功能 多任务标签页. 上下文菜单扩展. 对问 ...