UE里的Sync Groups

在Blend Space的源码里看到了这个东西,不太清楚是干啥的。

参考链接:https://www.youtube.com/watch?v=lWRsPl_IX7c&ab_channel=MattCourtois

看了下,Sync Group可以帮助更好的进行动画之间的过渡,它需要两步操作:

  1. mark your animations with sync markers
  2. make sure your animations are synchronized using sync groups

第一步,为动画添加Sync Marker
打开Anim Sequence,选择对应的帧,右键new Sync Marker就可以了,如下图所示,是这个作者为这个奔跑动画添加的两个Marker:
在这里插入图片描述
用类似的方法,作者接着为其他的走路的动画,也添加了的左右脚落地时候的Sync Marker,比如蹲着走的动画,比如从静止到起跑的过渡动画。


第二步,创建Sync Groups
由于这些动画里的Sync Markers都是走路的左右脚的Marker,为了让其生效,需要创建Sync Groups,具体的方法是在AnimGraph里,选中每个前面编辑过的动画Clip对应的节点,在Details里,为其选择Sync Groups,注意它们的名字需要是相同的,如下图所示:
在这里插入图片描述

底层原理

上述操作能让角色的脚步更自然,假设没有使用Sync Marker,对于人物起跑时,他会从Idle,开始播放Idle To Run这个过渡动画A,然后从A动画过渡到循环播放的跑步动画B,如下图所示是A和B动画的播放情况,三角形代表左右脚落地的时间位置
在这里插入图片描述

A到B这个过渡的时间是由User指定的,假设User指定为0.2s,那么二者的混合可能如下图所示,在红色点处,二者开始混合:
在这里插入图片描述
很明显此时有个问题,就是A动画在红色位置的状态是两脚腾空的,而B动画是左脚落地的,所以此时播放的动画会显得人物的左脚在被往下拽,播放起来很不自然。

但是如果有了Sync Marker和Sync Group,那么UE4会去判断,他会根据这个红色的位置,得到红色点在A动画里的LS和RS里所在的比例值,从而算出它在B动画里对应的位置,然后此时的B动画不会从LS处开始Blend,而是从计算得到的F点的位置开始Blend,如下图所示:
在这里插入图片描述

这样正好能保证,开始过渡Blend的时候,二者都是处于相同的状态。然后我猜这0.2s的时间里,最后的A的结尾,应该也会和B动画的结尾的比例去匹配一下。也就是说,过渡的开始,需要满足两个动画都在Marker之间相同的比例位置,在过渡的结束,也要满足同样的条件。


下面过一下UE4的官方文档:https://docs.unrealengine.com/4.27/en-US/AnimatingObjects/SkeletalMeshAnimation/SyncGroups/

Sync Groups文档

Sync Groups allow you to maintain the synchronization of animations of different lengths.

Sync Groups的核心理念是解决不同长度的动画的同步问题,上文已经给过一个例子,这里再举一个,比如说有一个Run和Walk动画,一般Walk的动画长度会比Run动画长一些,此时如果直接按照对应的时间进行Blend,效果是不对的,即使用normalized time进行blend,也不一定对,因为两个动画不能保证在0.2相对位置的时间地点正好同时抬左脚(或同时抬右脚)

Sync Group会指定其中一个主要的动画节点,把它叫做Leader,根据Leader的动画时长,改变其他所有相关的动画时长。一般会选用权重最大的节点作为Leader,随着时间改变,如果哪个节点权重变为最大,那么它会变成新的Leader。对应一些动画的Blend,还要做额外的处理,比如说Walk和Run动画的起始抬脚要一致等。

Sync Groups可以作用于动画节点,有这些:

  • AnimSequence
  • BlendSpace Nodes
  • State Machine Nodes

Group Roles: Leaders and Followers

Sync Groups works with the concept of group roles,就是各个节点代表的角色,这里应该就俩角色:Leader和Follwers。

Leader的特点:

  • Provides the master animation length that is used by all followers.
  • Executes all of its Notifies.

Followers的特点:

  • Scales its animation length to match the Leader.
  • Has its Notifies suppressed, deferring instead to Leader’s Notifies. 动画时间会抑制,传给其Leader

设置Sync Group

前面提到过,AnimGraph里选中对应的动画节点,Details里可以输入Group Name,这里还可以选择Group Role:
在这里插入图片描述
Group Role,可以选择:

  • Can Be Leader(Default)
  • Always Leader
  • Never Leader

Marker-Based Animation Syncing

在Animation Sequence里的Animation Notifications栏里金额已添加Sync Marker,相当于手动添加标记,让动画同步,如下图所示:
在这里插入图片描述

使用Sync Marker的时候,有以下规则:

  • 只有在同一个Sync Group里的动画才会被Sync到一起,Leader会驱动同一个Sync Group里的其他followers的位置移动
  • The play rate is always that of the master animation (play rate adjustment is currently not available). 应该是按照Leader的Playrate播放
  • 如果一个Sync Marker要生效,那么同一个Sync Groups里的所有动画都需要有这个Sync Marker,否则这个Sync Marker会被忽略掉
  • 在基于Leader的Position同步其他的动画播放的Position时,需要基于当前的Leader的Position相当于他们的Markers的相对位置,比如说,Leader有个左Marker和右Marker,此时其播放位置位于两个Marker的25%处,那么Followers也应该在各自Marker的对应位置(如果只有一个Marker呢? 应该会把End和Start也算Marker吧)
  • Marker based sync is used automatically when animations in a Sync Group have enough matching markers. Otherwise, the original scaled length syncing behavior is used.
  • AnimMontages also support marker-based sync while blending out, so you can transition back to other animations seamlessly. You can find the Sync Group setting Asset Details panel in the AnimMontage.

想到的问题,Sync Marker是不是最少俩?能不能只有一个?



UE5里的Sync Groups

参考:https://docs.unrealengine.com/5.0/en-US/animation-sync-groups-in-unreal-engine/

看了下,UE5的Sync Groups好像加了一些东西,所以这里把它的文档也过一下。

Sync Groups的概念还是一样的,同一个Group里的动画分为Leader和Followers,Leader作为动画的播放主线,Followers根据Marker于Leader同步,Leader可以优先触发Animation Notifies(Leaders provide the master animation length that is used by all followers and have priority for triggering Animation Notifies)。Followers match their animation lengths to leaders and have their notifies suppressed. Followers好像不会接受对应的notifes?如果多个动画进行Blend,那么默认是谁权重高,谁就是Leader,所以Leader是动态变化的

Sync Groups的注意事项

  • 同组的动画必须有类似的movement,比如Run和Walk动画,不能一个先抬左脚、一个先抬右脚
  • 同组的动画的时长不要差距太大,否则可能会导致一些动画播放速度加快,同时在leader切换时出现明显的播放速率的问题(causing noticeable playrate “pops” when leader and follower animations switch)

Sync Settings

在动画蓝图里,点击节点对应Details Panel会出现相关设置,如下图所示:
在这里插入图片描述

Group Name
同一组的动画,Group Name应该相同

Group Role
Group Role可以添加对Leader的设置,一共有如下几种,应该是在动画文件上设置:

  • Can be Leader:默认的选项,blend weight的最高值的动画作为Leader
  • Always Follower:顾名思义,不多解释,当同组所有动画都标为此类型时,第一个被evaluate的动画为Leader
  • Always Leader:同上,当同组多个动画都标为此类型时,最后一个被evaluate的动画为Leader
  • Transition Leader:当过度接入此动画时,此动画节点不参与Sync Group,一旦完成过度过程,那么此动画变成Leader
  • Transition Follower:UE4.17版本加入,当过度接入此动画时,此动画节点不参与Sync Group,一旦完成过度过程,那么此动画变成Follower

Method
有三种选择:

  • Do Not Sync
  • Sync Group: which will enable Group-Based Syncing.
  • Graph: which will enable Graph-Based Syncing. 应该是UE5的新内容

Sync Group Types

Sync Group类型

做法很简单,只要选中多个动画节点,要输入个String作为Group Name即可,不过这种方法没有老的Sync Maker,应该只是单纯的同步每个动画的时长而已:
在这里插入图片描述

使用Sync Group现在会在节点上显示出来,如下图所示:
在这里插入图片描述


Marker-Based Syncing

感觉跟文章前面讲的UE4的Sync Group是一样的,这里的动画节点的Group Name要一样,同时节点里都添加了相同名字的Sync Maker。

一般用于:

  • 动画步数不一样,For example, when blending a run cycle that has the right foot touching the ground four times, and the walk cycle’s foot only touches the ground two times.
  • 步长不一样,For example, when blending a time-rigid marching walk animation to a time-loose scramble running animation.
  • blend非loop动画,such as run and walk starts and stops. Additionally with this case, the start and stop animations should be set to Always Leader.

在动画资源,比如Anim Sequence上设置的Sync Maker,数据会保存到对应的Skeleton上。这样相同模型的动画就不要每次都new sync maker了,如下所示:
在这里插入图片描述


Graph-Based Syncing

Graph-based Syncing可以让整个图,或者Tree,里的节点都加入到一个GraphGroup里,需要做两步:

  • 所有Sync的节点类型变为,Graph-based,如下图所示:
    在这里插入图片描述

  • 创建Sync Node,连到这个子树的Output上,如下图所示:
    在这里插入图片描述

Typically, you may want to place this node after your pose logic, so that it can synchronize all incoming animation data.
在这里插入图片描述


Blend Space Graphs

还有种特殊的Graph-based group,就是Blend Space,此时的Sync会应用到所有的Sample上。操作是一样的,选中BlendSpace节点,设置Group Name:
在这里插入图片描述
此时,Sample里对应的动画节点会随着设置为Graph类型:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/alexhu2010q/article/details/121164599
今日推荐