前言
在很多游戏的开场动画或者CG里,我们往往会碰见一些很酷炫的镜头效果。例如一个场景,我们的画面会从远处可以观察到整个场景到被拉近视角观察到场景中的主角。又或者一些CG动画中,我们的视角会像一直飞翔的老鹰一样,掠过整个场景。
想要实现这样的效果,我们不能仅仅让我们的摄像机简单的看向和跟随一个目标,而是期望我们的相机能够按照一定的路径运动。
想要我们的摄像机按一定的路径进行,那么首先我们就要绘制出这个轨道,否则相机无法知道自己应该往哪走。Cinemachine为我们提供了Dolly Paths来实现路径的绘制。
Dolly Paths
使用Dolly Path就可以指定出一个特定的路径来供我们的VirtualCamera,例如下图:
图中的绿色的路径就是我们的相机的移动路径,它由图中的三个白点(0,1,2三个小圆球)连线而成。这些小白点,我们称之为waypoint。我们可以通过添加删除以及修改waypoint,来绘制我们想要的路径。
Cinemachine为我们提供了CinemachinePath和CinemachineSmoothPath两种组件用于绘制路径。
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同步移动了。