摄像机动画运镜
DCC里架设镜头潜在限制
- 导入导出数据同步问题
- 修改迭代效率低
- 无法预览完整效果
- 对Shot的数量产生限制
镜头的动画需要?
- 引导兴趣点
- 传达和表现兴趣点的行为特征或情绪
- 自然,有机,符合物理运动规律
实现这些点需要的手段
运动方式
速度
稳定性
UE运镜相关功能
曲线控制;速度控制;震动;斯坦你康(ease);惯性;目标追踪;焦点追踪;跟拍;约束;无人机;车载;Rig;摄像机动画重用;Take;关键帧清理优化… …
手动k帧
手动k帧是产生主要动画最重要的一个手段。
下面例子是摄像机位置移动的动画。
我们先做一个摄像机在y轴平移的动画。查看它的曲线面板,对y轴有两个关键帧,默认的曲线是一个逐渐加速并逐渐减速的过程。
现在我们做一个直接加速的过程。我们可以调节这两个关键帧的形态来产生一个加速。
相反我们可以表现一种减速的韵律,减速的效果其实就是一种缓冲的效果。就是类似于像斯坦尼康这种稳定器的效果。
接下来尝试添加一些更复杂的效果。回到加速的动画,在加速的开始阶段有个蓄力的过程。在动画的最后阶段有个惯性的回弹动画。首先把曲线往下拉点给它一种往后蓄力的效果,然后在最终加一个关键帧,对这个关键帧做一些微调,产生一个反弹的效果。
后续我们希望在多向量上也就是加上x和z轴,也能够达到先蓄力后回弹的这么一个韵律的加速动画。我们可以将x和z进行像y一样同样的一个曲率调整,但是这是相当困难和费事的一件事。并且最终的效果也是不可预期的。
此外,我们看下面的一个新k动画。从一个空间位置到另一个空间位置的直线移动。可以看到它的曲线在三向量上它移动的距离或者数值的变化并不一样。所以要做这样韵律的变化是相当困难的有一件事。
在这种情况下如果要做一些韵律的控制可以通过增加关键帧实现。
比如在路径中的这个位置加一个关键帧,然后用鼠标拖动把这个关键帧往前移。就会产生一个一开始很快到这个距离,类似减速的一个效果。
如果中间不满意的话,再添加关键帧进行适当的调整。通过不断的增加关键帧不断的调整来达到一个最终想要的效果。
虽然这样能达成期望,但是我们希望尽量用少的关键帧就能解决问题。
除了对速度韵律的控制比较困难,对中间值的把握或者插值的数值也是比较难控制的,最终反应就是位置或者角度并不是所期望的。
比如说这边用ARC,也就围绕一个选择对象的摄像机动画来说明。
这里为了k帧方便可以打开Editor Preferences下面的Orbit camera around selection,也就是说相机可以围绕选中的对象旋转,这样的话比较容易方便。
我们先k一帧然后到下一时间点转一圈k一帧,然后绕一圈这么k帧。但是这么产生的效果并不是我们想要的效果。我们从相机路径可以看出这是一个个方形的路径。不仅是位置有问题,摄像机对准球的角度也是有问题的,并不是始终对准这个球。
解决这个问题可以不断增加关键帧的密度,相当于逐帧记录。
所以解决这问题的思路是当遇到多向量属性的动画,应尽量把它转换成使用单向量的曲线能够表现出来。对于需要非常微妙的实时调整的那些动画,我们也可以通过一些程序动画表达出来。用不同方式的结合来表现只有逐帧动画才能够表现的复杂效果。
对于这种三维空间复杂的有韵律的运动以及对三向量的动画,我们可以用单向量的轨道动画来实现。因为轨道动画位置的百分比是一个单一的float向量。所以我们更加容易控制它的韵律,以及后期的调整修改也比较方便。
可以看到这条曲线运用到轨道上后,摄像机一开始的蓄力加速后面的震荡的惯性都会被表达出来。
同样对于ARC围绕对象的动画也是使用轨道,并且开启了Look At Tracking这个程序动画,两者结合实现比较复杂的摄像机动画。
ARC动画我们还可以使用UE自带的Camera Rig Crane的工具,也就是摇臂来实现。这更加方便点。我们可以调整摇臂的仰角,旋转的角度以及摇臂的长短来控制最终的效果。
什么时候打关键帧
为了减少关键帧的数量,我们要考虑在最关键的时间点去k帧。
什么是最关键的时间点呢?我认为就是在速度突然变化的那个转折点。这个转折点可以是从快的速度突然停止。然后从停止启动突然加速这些点或者说速度的方向发生了改变。
具体例子看视频。
Look At Track
接下来我们看一下程序动画中摄像机的look at tracking,就是朝向对象的这个程序动画的功能及使用。
使用非常简单,只要打开摄像机的look at tracking,并且选择一个要tracking的对象。比如一个绿色的小球,完了以后只要运动这个绿色的小球,摄像机总是跟随它运动。
我们可以在Sequencer里通过k帧修改摄像机tracking的对象。比如我现在tracking的是绿球给它k一帧。然后在接下去的时间点tracking一个灰色小球再k一帧。然后可以看到摄像机视角从绿色的转到灰色的。它是个瞬间转动的过程,所以我们看上去像一个跳板的工程。
但是在实拍当中可能不需要这样的瞬切。我们可以使用Look at Tracking Interp speed。意思就是在转动的过程中有个ease或者缓冲的过程。默认0的情况下就是没有任何缓冲就是瞬间的转动。比如我们给它一个适当的缓冲,再来看下效果。就可以产生这种类似于在两个转向之间k了关键帧,并有一定的曲线连接的过程。
参数越小它的ease或者缓冲的幅度就越大,反之就越小。我们可以用这个功能实现甩镜头的效果。而不必要在两个目标之间k关键帧,并且调整关键帧之间的曲线来实现同样的效果。
另外look at tracking追踪对象始终处于画面的中心,这绝大多数时候是我们不期望的。我们可以调整look at tracking的偏移值,用此来改变构图。它这个方向是基于追踪目标的local space的方向。
如果对这种以logo space为坐标系的偏移,使用起来不是很顺手的话,我们可以用其它方式。比如我这边有两个物体,圆柱体是角色,球体是 tracking的对象。
一般在实际应用当中可能不是直接tracking角色,而是先tracking一个虚拟对象。然后把它attach到角色身上,比如attach到角色的头骨,这样的话在调整偏移的时候,我们可以直接通过调整tracking对象的local坐标系来调整偏移。这样角色的转向也不会变。当然角色的转向变了会影响tracking对象的朝向,从而影响偏移的方向。
如果我们希望这个不起效的话,可以通过设置tracking对象的旋转的坐标系。从相对于角色,相对于父级而变成相对于世界。这样的话角色的转动是不会影响它的local space的转动的。
这时候摄像机的偏向虽然也是基于这个对象的,但是事实上就是基于世界坐标轴的,这样可能使用起来会比较稳定或者方便一些。
想这种look at tracking程序驱动或逻辑驱动的摄像机动画,也是一种为摄像机添加次级动画的一种主要方式之一。就像之前看的《1917》的片段里摄像机的跟随动画当中tracking这个角色。这个角色的晃动,摇摆,对摄像机的角度的变化是有一定的影响的。这样可以增加摄像机的有机性。
我们也可以用look at tracking来做这个事。比如这边用摄像机 tracking一个上下弹跳的小球。可以看到在摄像机的视野范围内跟着小球上下跳动。但通常不需要这么强烈的驱动感,我们可以增加look at tracking的Interp speed来减弱或者缓冲这种tracking。我们减小数值来更加ease这个tracking直到我们期望的值。这样小球的动画对摄像机就产生了微妙的影响,画面当中的元素跟摄像机的动画就具有相关性,可以增加画面的感染力。这种动画在key frame里面做比较麻烦。
Focus Track
下面介绍摄像机自带的也常用的一个程序动画的功能就是自动的聚焦。使用比较方便,就是选中tracking的聚焦方式,然后选中一个需要聚焦的对象就可以了。
我们也可以通过Sequencer对这个聚焦对象添加关键帧,这边加了两帧,一个聚焦前景,一个聚焦后景。
一般实际的应用中,我们可能也会添加一个虚拟体作为聚焦对象,然后把虚拟体attach到角色身上。比如角色的头骨和眼睛,从而产生更加精准的聚焦点。
大家可以看到这个聚焦是跳变的,从前景突然跳到背景,然后再跳到前景。同样这个自动聚焦功能也有ease或者smooth的一个功能,能让聚焦变得更加的有机。有一种慵懒对焦的感觉,符合实际的摄像机聚焦方式。
另外这边还有一个焦点的offset,这个offset是指在焦点附近可以前后做一个偏移。我们也可以对它k关键帧来产生一种聚焦犹豫的感觉。
比如这边用camera animation做一个offset的动画,让焦点聚焦到前景时做一定的犹豫,来模拟更加复杂和有机的这种摄像机聚焦的行为。
camera animation的使用,创建在后面介绍。
下面狐獴案例的具体演示看视频。
自定义程序动画
除了上述自带的摄像机程序动画外,我们可以通过UE的蓝图脚本去编写一些自定义的程序动画的行为,并在编辑器里可以实时预览。
首先我们先看一下大的一个应用流程,然后再具体看一下逻辑层面怎么来实现各种效果。我们可以利用引擎自带的virtual camera的插件结合camera的modified component模块来实现这样的效果。
打开以后就可以在camera component下添加一个叫VCAM的模块。在VCAMERA模块下,我们就可以为其添加camera的modifier的次级模块。然后选择一个需要添加的具体的modifier。
这边右键新建一个VCAM Modifier。命名为Mylookat,用来模拟摄像机自带的那个朝向目标的这么一个行为逻辑。
打开以后看到里面有两个Event,一个是初始化这个模块时候的Event,另外一个是逐帧和执行的Event。这个逐帧的效果可以在编辑器里实时被预览到。
接下来我们简单的编写一个look at的行为逻辑。这边有一个Camera Component input,它可以直接拿到这个modifier父级的Camera的Component对象。然后我们拿到它的一个位置。随后建立一个变量,这个变量是我们需要look at的一个目标。拿到它的位置,比较它们两个的位置算出它们之间的夹角,并使用这个夹角来改变当前Camera的旋转。下面是逻辑图。
选中VCAM1,添加Mylookat后,再pick一个target,就会产生一个look at的效果。
在Camera的Modifier Stack里面可以添加更多的modifier,也就是说我们可以把不同的效果进行叠加。
稳定和缓冲
下面具体来看一下我认为比较重要的实现程序动画的一些节点。
首先缓冲效果可以通过一系列的节点来实现,它主要模拟的是刚才我们看到的比如摄像机look at tracking变化,跟随目标以后的一个平滑的过渡或者是焦点变化以后的平滑过渡,以及模拟想斯坦尼康这种稳定器的效果,都是一种缓冲效果。
这里以最简单的Interpolation的节点举例,它有很多版本,这里用了一个float最简单的单向量interpolation来举例。它有两个数值一个是当前的一个值,还有个目标值。然后根据每帧的时间(Delta Time)和interpolation的速度返回一个中间值。然后这个中间值更新以后,第二次tick的时候要喂进去。作为当前的Current值,再跟target的值进行插值或者运算以后再返回这样一个不断循环的过程。从而最终产生一个渐变的过程。
比如这边我current的值是0和目标值是100。然后再这个loop当中0~100是一个渐变的过程,而不是突然跳变到100。用这种形式来实现值的一个比较平滑的过渡。产生一种延迟缓冲的效果。
除了Interpolation的节点以外,其它还有一些节点可以实现类似的效果。下面简单介绍几个,一个是Ease,Ease也是在ab之间做interpolation。除了多一些参数以外,最重要的它可以变化这个interpolation的节奏或者一些曲线的曲率是加速还是减速或者S型等等,实现更多的效果。
下面两个是Average,一个是普通的Weighted Average,另一个是动态的Weighted Average。区别是普通的就是用一个权重值来决定混合或者ease的时候,当前数值和目标数值之间使用哪个的权重更多。动态的就是把权重分成了最小和大两个值。那么调用的时机是取决于当前值和目标值之间的差别。当差别比较小的时候,调用最小的权重。当差别比较大的时候,调用最大的权重。也就是说当前值到目标值在变换的过程当中,一开始的变换节奏和快要接近目标结束时的变换节奏可以是不一样的。从而产生一种非常动态的缓冲或者说smooth效果。
演示效果看视频
除了用float的值也可以用三向量的。
还可以做到变焦的缓冲。(可以看视频了解)
稳定(离线Filter)
关于稳定聊一下离线的处理方式。当有一些非常琐碎的抖动,尤其是从动画捕捉采入的那些数据。使用程序动画的方式可能无法很好的消除这些抖动。引擎自带了一些filter可以用来离线的处理这些数据。
不如说现在希望把这些高频的细节给过滤掉。选中需要过滤的曲线使用filter Fourier Transform这个filter。然后一般来说我们如果高频细节的过滤使用lowpass。然后把这个数值设置的比较小即可。
可以看到它保留了低频的起伏,但是过滤掉了高频的起伏。也可以做个简化减少关键帧。
想保留高频则反之。
惯性
实现惯性有一个现成的节点来模拟一个弹簧的效果。
具体演示效果看视频
跟拍
跟拍是经常使用到的一种运镜方式。我们通常可以用k帧和轨道的方式来实现。
UE的virtual camera自带了一个跟随的动画模块叫做Follow Modifier。有一种跟随和缓冲的效果。还有很多参数可以调实现不同跟拍效果。
但是它有一些问题,Camera所有的运动逻辑都是被Camera Modifier所控制。因此无法在Sequencer里面对Actor本身或者Component做任何位置或者旋转的调整。而且它是控制Camera Component层级,所以actor总在一个固定的位置。
因此所有动画用这个Modifier来做的话,都是通过参数来调整它的位置
这样显得不是太方便。所以可以参考它的实现来进行修改。
具体演示看视频
其实我们也可以借用Camera Rig Crane来实现类似跟随相机的效果。使用Camera Rig Crane作为中介,摄像机则始终look at目标。跟随行为则用attach方式,把Camera Crane attach到目标小球。
需要注意的是Camera Crane的旋转和放缩需要基于世界而非Relative。以避免角色的旋转动画对它产生影响。
更简单的方法则是直接把Camera attach到对象上。然后把这个对象attach到一个角色对象上来实现。
后续的演示和展开具体看视频
Camera shake
Camera shake我们可以在定序器里使用Camera shake的Track去调用一个事先创建好的Camera shake的资产。
载入以后在适当的时间触发,我们可以调整它播放时间的长短,以及shake的强度。
我们打开Camera shake的资产,可以通过这个面板来配置震动的方式和表现。比如持续时间,渐入渐出的混合时间以及分别在旋转位置甚至焦距上随机或者震动变换的参数。
Camera Animation
Camera Animation是另外一种增加次级动画的方式。添加方式和Camera shake大同小异。
具体演示看视频
无人机
我们可以通过程序动画实现无人机的效果。
具体演示看视频
交通工具
我们还可以通过程序动画实现交通工具的效果。比如甩尾侧滑。
具体演示看视频
程序动画也具有确定性
总结
- 尽量能在UE里做摄像机动画
- 运动方式,速度和稳定性
- UE运镜及各种Camera Rig的实现