Unity 3D里相机的平滑跟随(转)
1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4 public class MoveCamera : MonoBehaviour
5 {
6 public float distance = 10.0f;//目标物体与摄像机之间在世界坐标基础上保持水平上的距离
7 public float height = 5.0f;//摄像机与目标物体之间的高度差
8 public float heightDamping = 2.0f;//高度变化阻尼
9 public float rotationDamping = 3.0f;//旋转变化阻尼
10 public float offsetHeight = 1.0f;//在摄像机采用lookAt()方法时让他关注的坐标向上偏移1个单位
11 Transform selfTransform;//定义一个对自身的引用
12 public Transform Target;//目标物体引用
13 [AddComponentMenu("Camera-Control/Smooth Follow")]
14 void Start()
15 {
16 selfTransform = GetComponent<Transform>();//获得自身的组件信息
17 }
18 void LateUpdate()
19 {//使用这个更新方法就是保证每帧刷新时,物体先变化,然后摄像机才跟随的
20 if (!Target)
21 return;//安全保护
22 float wantedRotationAngle = Target.eulerAngles.y;//目标物体的角度
23 float wantedHeight = Target.position.y + height;//目标物体的高度
24 float currentRotationAngle = selfTransform.eulerAngles.y;//当前摄像机的角度
25 float currentHeight = selfTransform.position.y;//当前摄像机的高度
26 currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);//执行每一帧时为达到平滑变化的目的,采用线性插值方法每次变化一点
27 currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);//如上
28 Quaternion currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);//因为旋转角的变化不好用具体的变化角度表示,而四元数刚好可以表示角度绕哪个轴旋转多少度,表示角度的变化值
29 selfTransform.position = Target.position;//这一步是整个跟随算法核心的步骤,目的是将目标物体的世界坐标位置付给摄像机,如此摄像机的位置就和目标位置重叠,此时只需要根据上面存储的摄像机的位置信息,恢复摄像机的应有位置即可。再次注意,此处改变只是世界坐标的position改变,并没有涉及摄像机自身的镜头朝向,及旋转。所以说可以利用上面记录的旋转角的变化量(四元数)来处理摄像机的变化。
30 selfTransform.position -= currentRotation * Vector3.forward * distance;//摄像机此时的位置参数减去角度变化的四元数乘以水平偏移量的积,如此就可以得出摄像机在目标物体后方的位置及状态。
31 Vector3 currentPosition = transform.position;//把上面已变化一部分的摄像机位置信息暂存下来
32 currentPosition.y = currentHeight;//改变高度
33 selfTransform.position = currentPosition;//改变过的信息给摄像机
34 selfTransform.LookAt(Target.position + new Vector3(0, offsetHeight, 0));//使摄像机关注目标物体的坐标中心且是用摄像机的本地坐标,另外需要注意的是,摄像机关注的是物体本地坐标的z轴方向
35 }
36 }
Unity 3D里相机的平滑跟随(转)的更多相关文章
- [Unity 3D] Unity 3D 里的碰撞检测
Unity 3D里两个碰撞体之间发生碰撞可以用OnCollision族函数和OnTrigger族函数来获知和处理.Unity官方给出了两张可发生碰撞的组合表: Collision detection ...
- Unity 3D 正交相机(Orthographic)
1. Camera.aspect 表示摄像机显示区域的纵横比.宽高比,摄像机初始化的时候会默认设置成当前屏幕的宽高比,可以更改,也可以通过 Camera.ResetAspect 来重置. 2. Cam ...
- Unity 3d 实现物体跟随摄像机视野运动
https://blog.csdn.net/qq_31411825/article/details/61623857 Unity 3d 实现物体跟随摄像机视野运动Created by miccall ...
- C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型
遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...
- Unity 3D网络游戏实战 pdf
Unity 3D网络游戏实战(全) 目录: 掌握Unity3D基本元素 1.1 简单的游戏 1.1.1在场景中创建一个立方体 1.1.2编写可以使立方体运动的程序 1.1.3测试游戏1.1.4总结1. ...
- 【图说】Eclipse与Unity 3D协同工作
原地址:http://blog.csdn.net/h570768995/article/details/9355313 Eclipse开发过程中总会碰到很多的难题,如何利用好工具帮助我们更快捷的开发也 ...
- [Unity 3D] Unity 3D 性能优化 (一)
听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...
- Unity 3D使用GameObject创建一个简单的可移动物体
于Unity 3D游戏的开发.游戏脚本需要3D模拟组合,该脚本将被写入阻力3D为了达到效果对象. 以下是一个小实例,使用Unity 3D实现一个可控制移动的小人.小人能够向前.向后.向左和向右移动. ...
- Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)
MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...
随机推荐
- LTMU论文解析
LTMU 第零部分:前景提要 一般来说,单目标跟踪任务可以从以下三个角度解读: A matching/correspondence problem.把其视为前后两帧物体匹配的任务(而不考虑在跟踪过程中 ...
- Linux Shell 错误: $'\r': command not found错误解决
在Linux下执行程序最省事的方式就是将系统的执行流程封装成一个shell脚本,上传到linux环境中后就可以直接执行了,但是今天在具体实施的时候出现了错误 $'\r': command not fo ...
- kali 系列学习09-Kali-linux设置ProxyChains
ProxyChains是Linux和其他Unices下的代理工具.它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP.SOCKS4和SOCKS5类型的代理服务器,并且可配置多个 ...
- 基于chaosblade的故障注入平台小试
当今社会互联网应用越来越广泛,用户量日益剧增.在人们对互联网服务的依赖性增大的同时,也对服务的可用性和体验感有了更高的要求.那么如何保障服务在运营过程中能一直给用户提供稳定的.不间断的.可靠可信的服务 ...
- 关于oracle11g 和sqldeverloper的安装配置
0友情提示:以下下载地址都是我的百度云分享链接安全无毒请放心下载! 电脑配置 win10 jdk版本1.7 下载oracle11G 版本 下载地址:安装很简单 sqldverloper(oracleD ...
- 在Guitar Pro中如何模拟电子管音响
在这篇文章中,我们将使用Guitar Pro 7中的功能和工具,完成构建一个真实的电子管吉他音箱调音过程. 虽然Guitar Pro是用于创建吉他乐谱的工具,但在新版本中(主要是6和7)它也有一些模拟 ...
- 通用于wps和excel的ntlm hashes窃取利用方式
https://evi1cg.me/archives/Get_NTLM_Hashes.html介绍了通过Microsoft Office 窃取 NTLM Hashes. 不过这种插入方法不适用于wps ...
- yii2.0 删除文件夹
/** * 删除文件缓存 */public function actionDelfilecache(){ $cachePath = Yii::getAlias('@app/runtime/cache' ...
- MySql学习笔记--详细整理--下
目录 索引 测试索引 索引原则 权限管理和备份 备份 规范数据库设计 三大范式 JDBC JDBC程序 Statement对象 工具类实现 sql注入 PreparedStatement对象 事务 数 ...
- 【Updating】汇编语言学习记录02
换码指令.字符的输出 前置知识: XLAT 指令:将BX指定的缓冲区中.AL指定的位移处的一个字节数据取出赋给AL,实际相当于(AL) = (DS:(BX+AL)).注意,不是单纯地赋予AL+BX,而 ...