using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class viewchange : MonoBehaviour {public static viewchange Instance=null;/// <summary>/// 相机透视改变是否触发(调用只需把此值改为true)/// </summary>public bool ChangeProjection = false;private bool _changing = false;public float ProjectionChangeTime = 0.5f;private float _currentT = 0.0f;void Awake(){Instance=this;}private void Update () { ///检测,避免变换过程中发生混乱if (_changing) {ChangeProjection = false;} else if (ChangeProjection) {_changing = true;_currentT = 0.0f;}}/// <summary>/// Unity3D中Update和Lateupdate的区别。Lateupdate和Update每一祯都被执行,但是执行顺序不一样,先执行Updatee然后执行lateUpdate。///如果你有两个脚本JS1、JS2,两个脚本中都有Update()函数, 在JS1中有 lateUpdate ,JS2中没有。那么 lateUpdate 函数会等待JS1、JS2两个脚本的Update()函数 都执行完后才执行。/// </summary>private void LateUpdate () {if (!_changing) {return;}//将当前的 是否正视图值 赋值给currentlyOrthographic变量bool currentlyOrthographic = Camera.main.orthographic;//定义变量存放当前摄像机的透视和正视矩阵信息;Matrix4x4 orthoMat, persMat;if (currentlyOrthographic) //如果当前摄像机为正视状态{orthoMat = Camera.main.projectionMatrix;Camera.main.orthographic = false;Camera.main.ResetProjectionMatrix ();persMat = Camera.main.projectionMatrix;} else //否则当前摄像机为透视状态{persMat = Camera.main.projectionMatrix;Camera.main.orthographic = true;Camera.main.ResetProjectionMatrix ();orthoMat = Camera.main.projectionMatrix;}Camera.main.orthographic = currentlyOrthographic;_currentT += (Time.deltaTime / ProjectionChangeTime);if (_currentT < 1.0f) {if (currentlyOrthographic) {Camera.main.projectionMatrix = MatrixLerp (orthoMat, persMat, _currentT * _currentT);} else {Camera.main.projectionMatrix = MatrixLerp (persMat, orthoMat, Mathf.Sqrt (_currentT));}} else {_changing = false;Camera.main.orthographic = !currentlyOrthographic;Camera.main.ResetProjectionMatrix ();}}private Matrix4x4 MatrixLerp (Matrix4x4 from, Matrix4x4 to, float t) {t = Mathf.Clamp (t, 0.0f, 1.0f);Matrix4x4 newMatrix = new Matrix4x4 ();newMatrix.SetRow (0, Vector4.Lerp (from.GetRow (0), to.GetRow (0), t));newMatrix.SetRow (1, Vector4.Lerp (from.GetRow (1), to.GetRow (1), t));newMatrix.SetRow (2, Vector4.Lerp (from.GetRow (2), to.GetRow (2), t));newMatrix.SetRow (3, Vector4.Lerp (from.GetRow (3), to.GetRow (3), t));return newMatrix;}void OnGUI () {// GUILayout.Label ("New Camera.main.projectionMatrix:\n" + Camera.main.projectionMatrix.ToString ());// if (GUILayout.Button ("更改CameraProjection")) {//  ChangeProjection = true;// }}}

unity实现透视相机与正交相机的平滑切换相关推荐

  1. Three 之 three.js (webgl)透视视角和正交视角,以及透视转正交的视角切换

    Three 之 three.js (webgl)透视视角和正交视角,以及透视转正交的视角切换 目录 Three 之 three.js (webgl)透视视角和正交视角,以及透视转正交的视角切换 一.简 ...

  2. Unity正交相机适配

    unity的正交相机,在适配的时候默认情况下是高度不变,而宽度会随着屏幕大小进行改变,之前还以为这个要自己去处理,但是测试之后才发现,都已经做好了. 如果我们的项目需要高度改变,宽度不变,那么添加代码 ...

  3. Unity 3D 正交相机(Orthographic)

    1. Camera.aspect 表示摄像机显示区域的纵横比.宽高比,摄像机初始化的时候会默认设置成当前屏幕的宽高比,可以更改,也可以通过 Camera.ResetAspect 来重置. 2. Cam ...

  4. unity, 相机空间 与 相机gameObject的局部空间

    在unity里 相机空间 与 相机gameObject的局部空间 不重合. Camera.worldToCameraMatrix的文档中有这样一句话: Note that camera space m ...

  5. Libgdx之正交相机 OrthographicCamera

    本翻译自Libgdx Wiki 本文主要介绍OrthographicCamera相机类和用法.OrthographicCamera是正交相机,用在2D游戏开发中,无论游戏物体放在游戏世界中的那个位置, ...

  6. 【threejs】透视相机,实现相机根据模型大小自适应,将模型放置在视角内

    透视相机,实现相机根据模型大小自适应,将模型放置在视角内 const box3_2 = new THREE.Box3().setFromObject(object); //新建一个Box3包裹盒把模型 ...

  7. 【Ios】 Unity for iOS 打开相册、相机及保存图片到相册

    偶然在网上看到一位博主写的 unity 和ios 交互 个人感觉 功能很全 转载地址:http://blog.csdn.net/AnYuanLzh/article/details/50748928 在 ...

  8. Unity填坑之俯视角相机水平面方向移动

    Unity填坑之俯视角相机水平面方向移动 文章目录 Unity填坑之俯视角相机水平面方向移动 前言 一.需求分析 二.解决方案有两种 1.模拟一个小人 2.通过四元数旋转的方式 总结 前言 碰到一个需 ...

  9. Unity判断一个物体是否在相机范围内

    Unity判断一个物体是否在相机范围内 思路 代码 注意点 思路 先说下思路,先把物体从世界坐标转到该相机的视口坐标viewPos, 如果满足这两个条件: 0<viewPos.x < 1 ...

  10. 相机标定篇——相机标定

    认为相机标定是三维重建的核心,研究生期间主要方向为结构光三维重建 必要的数学知识 线性方程求解 Gauss消元法:LU分解:Cholesky分解 最小二乘问题-线性方法 特征值分解:奇异值分解:超定线 ...

最新文章

  1. 探索 | 神经网络到底是如何思考的?MIT精英们做了这么一个实验室来搞清楚
  2. Android自定义View,滑动,事件传递小结
  3. 杰奇为什么只能用php5.2,杰奇2.2修改系统定义后,网站报错问题解决
  4. python流程控制-实战案例手把手教你Python流程控制技巧
  5. NYOJ 737 合并石子(一)
  6. ajax发送数据时的contentType
  7. PHP 基础知识测试题
  8. flask-sqlAlchemy 创建表
  9. 论文阅读:Deep Image Matting
  10. JNI用C加载JDK产生JVM虚拟机,并运行JAVA类main函数(MACOS/LINUX/WINDOWS)
  11. AD09 PCB制作开异性窗口
  12. xposed框架_无需Root使用Xposed框架、功能非常强大
  13. 全球电动汽车电池隔膜行业调研及趋势分析报告
  14. 不能错过!​9个让你随时保持精力充沛的习惯
  15. ZOJ 4093 浙大校赛D题 Robot Cleaner II(思维+构造题)
  16. 汇编语言:写一个简单的音乐程序
  17. Coreldraw2022cdr新版更新矢量图设计
  18. # 开发 VR 多人游戏的技术挑战
  19. 【20230302】【剑指1】数学(中等)
  20. 小酷智慧地图3D导览v1.0.82 打卡定位 地图打卡

热门文章

  1. Linux基础命令之好用的组合
  2. C语言实现银行管理系统
  3. Linux服务端监控
  4. (CSS)3.三种基本选择器(标签,类,id)
  5. Chrome插件(扩展)开发全攻略
  6. Azure vNet
  7. 【游戏运营】【笔记】 谈谈对游戏运营的理解
  8. 有隐藏分区如何激活win7旗舰版
  9. 定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。
  10. 保研推免经历经验分享——2018北大软微、北航计算机、南大计算机夏令营保研经历