Unity 相机 2D视角 与3D 视角 自由动态 切换
2017-12-21 09:41
756 查看
再游戏运行的时候,往往需要 在 正交Orthographic (无消失点投影)
与正交Orthographic (无消失点投影)
两个视角中来回转化。 以达到 不同的 2D 与 3D 视角。
So! 今天的 实例代码就是 描述了 这一个功能:
using UnityEngine; public enum Views { _2DView = 1, _3DView } public class BackupCameraProjectionChange { /// <summary> /// 相机透视改变是否触发(调用只需把此值改为true) /// </summary> public bool ChangeProjection = false; private bool _changing = false; private float ProjectionChangeTime = 0.5f; private float _currentT = 0.0f; private Camera m_Camera; protected Views cur_Views = Views._3DView; public Views GetCurViews { get { return cur_Views; } } public BackupCameraProjectionChange(Camera camera = null , float speed = 0.5f) { ProjectionChangeTime = speed; if (m_Camera == null && camera == null) { m_Camera = Camera.main; } else { m_Camera = camera; } } ///这个 Update 需要在 其他继承自 MonoBehaviour 类的 Update 中 调用 public void Update() { if (m_Camera == null) return; if (_changing) { ChangeProjection = false; } else if (ChangeProjection) { _changing = true; _currentT = 0.0f; } LateUpdate(); } void LateUpdate() { if (!_changing) { return; } //将当前的 是否正视图值 赋值给currentlyOrthographic变量 bool currentlyOrthographic = m_Camera.orthographic; //定义变量存放当前摄像机的透视和正视矩阵信息; Matrix4x4 orthoMat, persMat; if (currentlyOrthographic)//如果当前摄像机为正视状态,则切换为3D { orthoMat = m_Camera.projectionMatrix; //保留 2D矩阵信息 m_Camera.orthographic = false; //为 3D m_Camera.ResetProjectionMatrix(); persMat = m_Camera.projectionMatrix; //保留 3D 矩阵信息 cur_Views = Views._3DView; } else//否则当前摄像机为透视状态, 则切换为2D { persMat = m_Camera.projectionMatrix; //保留 3D 矩阵信息 m_Camera.orthographic = true; //为2D m_Camera.ResetProjectionMatrix(); orthoMat = m_Camera.projectionMatrix; //保留 2D矩阵信息 cur_Views = Views._2DView; } m_Camera.orthographic = currentlyOrthographic; _currentT += (Time.deltaTime / ProjectionChangeTime); if (_currentT < 1.0f) { if (currentlyOrthographic) { m_Camera.projectionMatrix = MatrixLerp(orthoMat, persMat, _currentT * _currentT); //从2D 到 3D } else { m_Camera.projectionMatrix = MatrixLerp(persMat, orthoMat, Mathf.Sqrt(_currentT)); //从3D 到 2D } } else 4000 { _changing = false; m_Camera.orthographic = !currentlyOrthographic; //取反 m_Camera.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; } }
更多: Unity 算法功能 日記
相关文章推荐
- Unity -- 正交/透视相机切换(2D/3D相机切换)
- Unity 3D: 鼠标和键盘自由切换场景视觉
- Unity鼠标自由查看3D物体之控制摄相机Camera
- 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
- Unity之2D游戏界面相机适配
- 【转】如何使用Unity创造动态的2D水体效果
- 【Unity 3D学习】把3D模型放置到2D平面的两种方法
- opencv中3D点根据相机参数投影成2D点+solvePnP函数计算相机姿态+2D坐标到3D+相机参数calibration(标定与配准,求得深度彩色相机的内参与外参,再进行配准)
- unity下2d和3d混合使用教程,插件为OrtHello (一)
- [Unity]关于多角色自由切换主操作角色的问题
- unity3d设置3D模型显示在2D背景之前(多个相机分层显示)(转)
- 关于Unity在2D的UGUI和3D模型交错时渲染顺序的一点探讨
- 如何在 Unity 2D 和 3D 中放大或缩小以及点击屏幕
- Unity推出2D工具:不再只是3D引擎
- Unity中自带的第一人称与第三人称视角之间的切换问题
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?
- Unity 3D 动态创建对象,并渲染贴图,动态添加删除脚本
- Vuforia SDK---- AR开发vuforia 相机前后摄像头动态切换功能实现
- cad动态的2D/3D图形控件VectorDraw Developer Framework (VDF)
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?