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

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

大家好,又见面了,我是你们的朋友全栈君。

前言

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

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

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

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

 

Dolly Paths

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

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

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

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

 

CinemachineSmoothPath

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

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

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

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

Resolution

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

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

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

Path Color

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

Inactive Path Color

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

Width

Scene视图中,路径的宽度。

Looped

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

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

Path Length

路径的总长度。

Waypoints

waypoint的数组。

Waypoint.Roll

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

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

 

CinemachinePath

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

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

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

Prefer Tangent Drag

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

Waypoint.Tangent

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

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

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

 

Tracked Dolly

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

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

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

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值。

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

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上位移了一大段距离,例如下图:

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

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

 

Cinemachine Dolly Cart

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

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

属性

Cinemachine Dolly Cart的属性如下

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

Path

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

Update Method

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

Position Units与Position

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

Speed

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

 

应用

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

在工具栏中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同步移动了。

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140435.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • CSS制作一个半透明边框

    CSS制作一个半透明边框CSS制作一个半透明边框,background-clip属性,如何实现半透明边框

  • 各种数据库的分页查询语句[通俗易懂]

    各种数据库的分页查询语句

  • webstorm 插件_vscode插件开发文档

    webstorm 插件_vscode插件开发文档webstorm集成了很多强大的前端插件。使用的时候只需要在webstorm中搜索plugin就可以出来一堆,选择需要的安装j

  • SQL清空表数据表

    SQL清空表数据表SQL清空表数据表并使得自增ID从1重新开始计数truncatetabletable_name

  • 双边滤波——原理及matlab实现

      思维闭塞时可外出采采风。1、双边滤波简介:   双边滤波(Bilateral filter)是一种非线性滤波方法(空间权值+相似权值)——空间权值:模糊去噪;相似权值:保护边缘。2、双边滤波原理  双边滤波具有两个权重:空间权重与相似权重  1)空间权重:与像素位置有关,为像素之间的距离(欧式距离,空间度量),故可定义为全局变量放在循环外,通常定义为…

  • Openssl Heartbleed

    Openssl Heartbleed近日闹的沸沸扬扬的Heartbleed漏洞,仿佛一下子再次将人们拉回了对网络安全的关注和担忧。这个问题就是由于服务器端没有对用户发过来的心跳包数据进行边界检查,服务端根据用户心跳包指定的数据长度来返回同样长度的数据。如果用户指定长度为100字节,而实际心跳数据的长度只有1字节,服务端还是会memcpy长度100字节的数据,这样就会把服务端内存中的数据返回给用户,可能会…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号