前言

在很多游戏的开场动画或者CG里,我们往往会碰见一些很酷炫的镜头效果。例如一个场景,我们的画面会从远处可以观察到整个场景到被拉近视角观察到场景中的主角。又或者一些CG动画中,我们的视角会像一直飞翔的老鹰一样,掠过整个场景。

              

想要实现这样的效果,我们不能仅仅让我们的摄像机简单的看向和跟随一个目标,而是期望我们的相机能够按照一定的路径运动。

想要我们的摄像机按一定的路径进行,那么首先我们就要绘制出这个轨道,否则相机无法知道自己应该往哪走。Cinemachine为我们提供了Dolly Paths来实现路径的绘制。

Dolly Paths

使用Dolly Path就可以指定出一个特定的路径来供我们的VirtualCamera,例如下图:

图中的绿色的路径就是我们的相机的移动路径,它由图中的三个白点(0,1,2三个小圆球)连线而成。这些小白点,我们称之为waypoint。我们可以通过添加删除以及修改waypoint,来绘制我们想要的路径。

Cinemachine为我们提供了CinemachinePathCinemachineSmoothPath两种组件用于绘制路径。

CinemachineSmoothPath

在上面图中的路径,我们是用CinemachineSmoothPath来实现的,其内容如下图:

其中路径中的0,1,2三个点即对应着组件中Waypoints数组的成员。每个waypoint包含XYZ的坐标信息,以及Roll的旋转信息。waypoint之间的连线方式使用了贝赛尔曲线的插值法(Bezier interpolation),因此我们不需要进行太多的设置,Cinemachine就会帮我们绘制好光滑且连续的路径。推荐使用。

接下来,我们来看看组件中各个属性的具体含义:

Resolution

定义了waypoint之间路径的精确度,即被分为多少段,会影响到路径长度的计算。

例如下面三张图的效果,Resolution的值分别为:1,2,10:

                    

Path Color

Scene视图中,选中路径时,显示的颜色。

Inactive Path Color

Scene视图中,未选中路径时,显示的颜色。

Width

Scene视图中,路径的宽度。

Looped

勾选该选项,路径会首尾相连。例如下图,左图是不勾选的情况,右图是勾选了的情况:

                        

Path Length

路径的总长度。

Waypoints

waypoint的数组。

Waypoint.Roll

即waypoint点围绕着z轴的旋转,默认为0,我们的路径会平行于xz平面,若旋转90度,则会垂直于xz平面。例如下图中,左图我们下标1的waypoint的roll = 0,右图我们下标1的waypoint的roll = 90。

                               

CinemachinePath

CinemachinePath相比CinemachineSmoothPath区别主要在于,waypoint的属性中除了Position和Roll外,还多了Tangent属性。该属性主要用于调整waypoint间路径的弯曲程度,由于是我们自己调整的,因此若调整的不好,在Camera经过两段路径的接连处时,可能会出现抖动的情况。

大部分属性基本和前面的一样,就不重复介绍了。

Prefer Tangent Drag

如果我们要在Scene视图中通过拖动来调整Tangent时,但是此时Tangent的坐标系和waypoint的坐标系重叠时(即Tangent的值为Vector.zero),会发现点不到Tangent的坐标系。那么此时我们打开这个开关,就可以帮助我们优先选中的是Tangent的坐标系。

Waypoint.Tangent

我们可以理解为,有一个点,它到waypoint的偏移量为tangent的值。它和waypoint的连线,即该waypoint的曲线的切线。如下图:

切线的长度代表着bezier handle的强度,长度越长,曲线越平滑。

Tracked Dolly

根据前面的知识,我们已经可以绘制自己想要的路径了。那么,接下来,我们要如何让我们的Camera在路径上移动?在设置VirtualCamera的时候,我们知道,当给VirtualCamera设置了Follow目标时,Camera就可以跟随着我们设置的目标移动,而通过设置Body属性,可以设置相关的跟随方式。在Body中Cinemachine为我们提供了Tracked Dolly模式,用于实现Camera在路径上移动,具体设置如下:

老规矩,先来看看这些属性的含义:

Path

即VirtualCamera要使用到的路径,也就是我们前面提到的Cinemachine Path 或 Cinemachine Smooth Path。

Path Position 和 Position Units

Position Units的值会影响到Path Position的意义,因此放在一起说:

Position Units 取值 含义
Path Units Path Position取值范围 0~waypoints.Length-1,如Path Position=1,VirtualCamera即在下标1的waypoint所在的位置。
Distance

Path Position取值范围 0~Path Length,如Path Position=1,VirtualCamera即在距离起点长度为1的位置。

Normalized Path Position取值范围 0~1,如Path Position=1,VirtualCamera即在路径的终点。

Path Offset

VirtualCamera位置相对于Path的偏移,X的方向在Path所在平面且垂直于Path,Y的方向是Path的正上方,Z的方向在Path所在平面且与Path平行。会受到path旋转的影响,即waypoint的roll值。

                                     

Camera Up

如何设置VirtualCamera.transform.up的值,VirtualCamera在Aim计算时,会尝试遵守这个值。

Default 不修改VirtualCamera的up的值,使用Cinemachine Brain中World Up Override属性代替。
Path 使用当前位置Path的up向量
Path No Roll 使用当前位置Path的up向量,但是不受Roll影响
Follow Target 使用Follow目标的tramsform.up
Follow Target No Roll 使用Follow目标的tramsform.up,但是不受Roll影响

Auto Dolly

使用Auto Dolly,可以自动将VirtualCamera移动到Path上最接近Follow目标的位置。这样当我们Follow目标移动的时候,Path上的VirtualCamera会跟着移动到最接近我们目标的位置。

Enabled

开启或关闭Auto Dolly功能,开启该功能对性能会造成一定的影响。

Position Offset 偏移量(基于position units),Camera的最终在Path上的位置 = 最近的点 + 偏移量。
Search Radius

搜索半径,我们的Path是根据waypoint一段段连接起来的,这个半径指的是,在VirtualCamera所在的当前片段,向两边延伸多少个片段,作为搜索范围。若为0,则表示整个Path都作为搜索范围。

如果当目标移动时,Path上计算出的最近点不稳定,我们可以使用较小的值来缩小范围。

Search Resolution 将一个片段分成多少连续的块用于搜索。值越高结果越精确,但是消耗的性能也会更高。

不过需要注意的是,在某些情况下,我们目标移动一点点,但是导致Camera在Path上位移了一大段距离,例如下图:

甚至一些极端的情况,例如圆形的Path,目标在圆心,那么Path上的任何一个点到目标的距离都是最小距离。

Cinemachine Dolly Cart

如果想要我们的Camera自动在Path上移动,那么Cinemachine Dolly Cart组件可以帮助到我们。它可以约束带有它的GameObject在Cinemachine Path或Cinemachine Smooth Path上移动。效果如下:

属性

Cinemachine Dolly Cart的属性如下

Path

即指定一个Cinemachine Path或Cinemachine Smooth Path。

Update Method

速度不为0时,移动Cart的时机。对于普通的组件更新使用Update,若想要同步物理模块,使用Fixed Update

Position Units与Position

Tracked Dolly中的相同,不重复介绍了。

Speed

Cart的移动速度,同样受到Position Units的影响。

应用

在工具栏中Cinemachine提供了Create Dolly Camera with Track 和 Create Dolly Track With Cart两个快捷方式。

Create Dolly Camera with Track

可以帮我们创建一个VirtualCamera和一个Cinemachine Smooth Path,并且为我们设置好了Body的Tracked Dolly,与关联好了对应的Path。

此外我们也可以自己创建新的GameObject,添加Cinemachine Path或Cinemachine Smooth Path组件,并关联到VirtualCamera上。

接着通过添加删除修改waypoint就可以编辑我们的Path了。

Create Dolly Track With Cart

可以帮我们创建一个Cinemachine Smooth Path和一个Cinemachine Dolly Cart,同样关联好Cart的Path属性。

通常我们会将VirtualCamera的Follow目标设置为Cart,Body设置为Hard Lock To Target,这样我们的VirtualCamera就会和Cart同步移动了。

Cinemachine(四)在路径/轨道上移动的摄像头(Cinemachine Dolly Camera,Path And Cart)相关推荐

  1. Unity学习笔记 解决Cinemachine AutoDolly的虚拟相机在轨道上不按轨道前进方向运动的问题

    问题 在使用Cinemachine提供的Tracked Dolly来做路径运动时,若绘制的轨道有交错或者相对接近的地方,可能会出现摄像机没有按照轨道前进的方向实时移动而跳回到了原来的轨道上的情况. 解 ...

  2. abaqus创建路径_Abaqus后处理的四种路径的应用-技术邻社区

    Abaqus后处理的四种路径的应用 长安CAE  2016年10月12日 1522 Abaqus后处理的四种路径的应用 路径(PATH)在后处理中的作用还是比较大的,除了线性化,路径还可以通过映射提取 ...

  3. 数据科学 IPython 笔记本 四、Keras(上)

    四.Keras(上) 原文:keras-tutorials 译者:飞龙 协议:CC BY-NC-SA 4.0 4.1 深度学习导论 致谢:派生于 Valerio Maggio 的 deep-learn ...

  4. 鸟哥的Linux私房菜(服务器)- 第四章、连上 Internet

    第四章.连上 Internet 最近更新日期:2011/07/20 终于要来到修改 Linux 网络参数的章节了!在第二章的网络基础中, 我们知道主机要连上 Internet 需要一些正确的网络参数设 ...

  5. html 保存文件指定路径,78.上传文件及在服务器保存文件到任意路径

    上传文件到服务器是一个常用的操作,而在服务器上保存文件就需要多多用心了.因为你不可能只在一个路径里保存文件,所以需要实践一下保存文件到任意位置.当然,前提是你的应用程序有这样的操作权限. 首先建立一个 ...

  6. pygame里面物体闪烁运动_利用自闪烁发光二极管探究小车在倾斜轨道上的运动规律...

    2020年11月23日,周一,24小时安全值班.利用当班中午的时间,微主在创客空间测试了自闪烁发光二极管在匀加速运动中的效果,结果还比较满意. 将小车放置在倾斜的轨道上,将自闪烁发光二极管和纽扣电池构 ...

  7. (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上)

    目录 1.TCP四次挥手过程 2.挥手连环发问 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三) ...

  8. linux unix mac windows,文件路径-windows上的反斜杠和Mac OS/Linux/Unix上的正斜杠,Windows,倒,以及,macOSLinuxUNIX...

    文件路径 - Windows 上的倒斜杠以及 macOS / Linux / UNIX 上的正斜杠 1. 正斜杠 (斜杠 / ) 和反斜杠 (倒斜杠 \ ) Windows - 正斜杠,左斜杠,斜杠符 ...

  9. python,os操作文件,文件路径(上一级目录)

    转载一篇连接,查资料时发现的,对我帮助不小 链接 链接2 os.path.dirname用法 目录结构 我的目录结构: 目录结构 os.path.dirname(path) 语法:os.path.di ...

最新文章

  1. App功能测试的注意点
  2. 在DataList控件中删除数据记录
  3. c语言中文刷屏,c语言二维数组刷屏练习.doc
  4. Git/Git-flow使用心得
  5. 用Python画一颗心、小人发射爱心
  6. Delphi7中默认没有安装的官方控件
  7. HTTP:一次完整的HTTP服务过程
  8. 计算机专业的八字,生辰八字五行计算器
  9. TM1650芯片使用经验
  10. javascript学习心得
  11. 《远见》的读后感作文1000字范文
  12. 第 11 章 进度条媒体对象和 Well 组件
  13. Unity下载文件并显示进度
  14. 【Bandit Algorithms学习笔记】UCB算法的理论证明
  15. CANoe.DiVa 操作指南 -测试覆盖度分析
  16. 【Java】从Java代码到网络编程,三次握手又该如何理解
  17. c# 从一组数中随机抽取一定个数_C#随机一组不重复的数字
  18. 股票几个指数周收益率和月收益率的计算
  19. Fast Normalized Cross-Correlation
  20. C语言中fun的功能是将字符串,c语言程序设计请编写一个函数fun,它的功能是:将ss所指字符串中所.,c语言程序设计题 请编写一个函数fun,它的功能是:将ss所...

热门文章

  1. F28335的ADC采集电压不对(采集的电压值乱飘)
  2. C# 解/压缩rar/zip格式文件
  3. win10链接打印机及使用
  4. 页面设置色值与屏幕取值不符的问题
  5. STM32CubeMX Nucleo F767ZI 教程(2)
  6. HEAP: Free Heap block XXXX modified at XXXX after it was freed详解
  7. 源自中国顶级开源软件再下一城!向量数据库公司Zilliz完成6000万美元B+轮融资
  8. 字节青训前端笔记 | 理解CSS
  9. 杰里之ANC 调试【篇】
  10. C的几个小程序和概念(常见操作)(中)