问题背景:

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. 1、Linux基础

    1.centos 安装 2.磁盘分区表示方法 1.2.3.4:主分区,最多4个主分区,后数据为逻辑分区 主分区可以激活,但一个硬盘只能激活一个主分区 被激活的主分区就是用来引导操作系统的主分区 扩展分 ...

  2. rails byebug

    Gemfile里添加 gem 'byebug' bundle install 在要打断点的地方写 byebug byebug -h #帮助 c 放行,入下走 n 单行调适 q 退出进行 启动异步任务推 ...

  3. 用Java 实现一个异步任务 可终止,可中断,可继续功能

    在 Java 中实现一个异步任务可以使用多线程和线程池技术,同时需要考虑终止.中断和继续等功能.下面展示一个简单的示例代码,实现异步任务的终止.中断和继续等功能: import java.util.c ...

  4. 日常Bug排查-连接突然全部关闭

    日常Bug排查-连接突然全部关闭 前言 日常Bug排查系列都是一些简单Bug的排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材. Bug现场 最近碰到一个问题,一台机器上的连接数在达到 ...

  5. C语言:汉诺塔问题(Hanoi Tower)------递归算法

    汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...

  6. centos7下启动Django项目报错(sqlite错误)

    报错内容如下: [root@localhost project]# python3 manage.py runserver Watching for file changes with StatRel ...

  7. ModelScope初体验

    使用环境:windows 11 前置条件:已安装 anaconda 参考文档:环境安装 step1:新建一个 conda 环境,命名为 modelscope conda create -n model ...

  8. 鸿蒙极速入门(二)-开发准备和HelloWorld

    一.开发准备 本篇博客基于的系统版本:华为官方HarmonyOS版本3.1.OpenHarmony版本4.0Beta 开发语言 ArkTS语言(推荐) JS语言(支持) Java语言(已放弃支持) 从 ...

  9. 【阿里天池云-龙珠计划】薄书的机器学习笔记——快来一起挖掘幸福感!Task04

    [给各位看官请安] 大家一起来集齐七龙珠召唤神龙吧!!! 学习地址:AI训练营机器学习-阿里云天池 推荐一下我由此上车的公众号:AI蜗牛车,时空序列相关文章挺多的. Task01:基于逻辑回归模型的多 ...

  10. Vue.js 动画与过渡效果实战

    title: Vue.js 动画与过渡效果实战 date: 2024/6/4 updated: 2024/6/4 description: 这篇文章介绍了如何在网页设计中使用过渡动画和组件效果,以及如 ...