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里相机的平滑跟随(转)的更多相关文章

  1. [Unity 3D] Unity 3D 里的碰撞检测

    Unity 3D里两个碰撞体之间发生碰撞可以用OnCollision族函数和OnTrigger族函数来获知和处理.Unity官方给出了两张可发生碰撞的组合表: Collision detection ...

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

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

  3. Unity 3d 实现物体跟随摄像机视野运动

    https://blog.csdn.net/qq_31411825/article/details/61623857 Unity 3d 实现物体跟随摄像机视野运动Created by miccall ...

  4. C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型

    遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...

  5. Unity 3D网络游戏实战 pdf

    Unity 3D网络游戏实战(全) 目录: 掌握Unity3D基本元素 1.1 简单的游戏 1.1.1在场景中创建一个立方体 1.1.2编写可以使立方体运动的程序 1.1.3测试游戏1.1.4总结1. ...

  6. 【图说】Eclipse与Unity 3D协同工作

    原地址:http://blog.csdn.net/h570768995/article/details/9355313 Eclipse开发过程中总会碰到很多的难题,如何利用好工具帮助我们更快捷的开发也 ...

  7. [Unity 3D] Unity 3D 性能优化 (一)

    听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...

  8. Unity 3D使用GameObject创建一个简单的可移动物体

    于Unity 3D游戏的开发.游戏脚本需要3D模拟组合,该脚本将被写入阻力3D为了达到效果对象. 以下是一个小实例,使用Unity 3D实现一个可控制移动的小人.小人能够向前.向后.向左和向右移动. ...

  9. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)

    MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...

随机推荐

  1. tomcat安装证书https

    操作步骤(阿里云官网) 解压已下载保存到本地的Tomcat证书文件. 解压后您将看到文件夹中有2个文件,您可为两个证书文件重命名. 证书文件(domain name.pfx):以.pfx为后缀或文件类 ...

  2. 深度分析:Java虚拟机类加载机制、过程与类加载器

    虚拟机类加载机制是把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型. ​ 需要注意的是 Java 语言与其他编译时需要进 ...

  3. 苹果电脑不安装flash的话怎么看直播

    直播这种娱乐方式的兴起,让很多游戏玩家.脱口秀演员.歌手等拥有了一个更加宽广的舞台,可以更好地展现自己的才能.大部分的直播都是采取视频影像的方式直播,只有少部分才会采用纯音频的方式. 由于很多直播网站 ...

  4. 思维导图软件iMindMap:生活工作的好帮手

    思维导图iMindMap这样的好帮手在生活工作中能帮你打破困境,,至于它有哪些力所能及的事情就是下面小编要跟你讲的: 你是否经常遇到过这样的情况: 作为学生,你觉得学习紧张,虽然三更眠五更起,还是成绩 ...

  5. Java中对象在内存中的大小、分配等问题

    Java创建一个对象的过程 是否对象指向的类已经加载到内存了 如果没有加载,就要经过load.linking(verification.preparation.resolution).initiali ...

  6. 【P1588】丢失的牛——区间dp/bfs

    (题面来自Luogu) 题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接 ...

  7. EntityFramework Core健康检查

    前言 .NET Core提供对应方法可进行健康检查,那么在EF Core中是否也提供了相应的方式呢?EF Core 2.2+(包含2.2)版本提供了针对上下文的健康检查,接下来我们直接利用.NET 5 ...

  8. 整理一下dedecms的相关知识

    dedecms更改数据库连接 文件   data/common.inc.php ------------------------------------------------------------ ...

  9. 《技术男征服美女HR》—Fiber、Coroutine和多线程那些事

    1.起点 我叫小白,坐在这间属于华夏国超一流互联网公司企鹅巴巴的小会议室里,等着技术面试官的到来. 令我感到不舒服的,是坐在我对面的那位HR美女一个劲儿的盯着我打量!虽说本人帅气,但是也不能这么毫无顾 ...

  10. 基于CefSharp开发(三)浏览器头部优化

    一.上文回顾 上编实现了简单的网页加载功能包括URL输入.打开空标签页.网页链接中新页面处理等 本编将对网页的Title绑定.前进.后退.刷新等事件处理 二.Title绑定处理 当打开网页时Title ...