UE5——动画混合
创始人
2024-03-04 22:10:10
0

一、引言

关于动画的一些基础可以看我往期的文章:《UE5——动画重定向》

二、动画混合

1、动画混合的原理

动画: 我们知道动画实际上就是控制静态模型中的某些点按照一定的预定轨迹移动,简言之就是 “一组变换信息的集合”

动画混合: 多个动画里的每一条变换信息相互之间基于权重的运算

2、混合的方式

混合的方式有两种:覆盖、叠加
请添加图片描述

覆盖混合: 目标变换 = 原变换 * 权重

template<>
FORCEINLINE void BlendTransform(const FTransform& Source, FTransform& Dest, const float BlendWeight)
{const ScalarRegister VBlendWeight(BlendWeight);Dest = Source * VBlendWeight;
}

叠加混合: 目标变换 = 目标变换 + (源变换 * 权重 )

template<>
FORCEINLINE void BlendTransform(const FTransform& Source, FTransform& Dest, const float BlendWeight)
{const ScalarRegister VBlendWeight(BlendWeight);Dest.AccumulateWithShortestRotation(Source, VBlendWeight);
}/**
* Accumulates another transform with this one, with an optional blending weight
*
* Rotation is accumulated additively, in the shortest direction (Rotation = Rotation +/- DeltaAtom.Rotation * Weight)
* Translation is accumulated additively (Translation += DeltaAtom.Translation * Weight)
* Scale3D is accumulated additively (Scale3D += DeltaAtom.Scale3D * Weight)
*
* @param DeltaAtom The other transform to accumulate into this one
* @param Weight The weight to multiply DeltaAtom by before it is accumulated.
*/
FORCEINLINE void AccumulateWithShortestRotation(const FTransform& DeltaAtom, float BlendWeight/* default param doesn't work since vectorized version takes ref param */)
{FTransform Atom(DeltaAtom * BlendWeight);// To ensure the 'shortest route', we make sure the dot product between the accumulator and the incoming child atom is positive.if ((Atom.Rotation | Rotation) < 0.f){Rotation.X -= Atom.Rotation.X;Rotation.Y -= Atom.Rotation.Y;Rotation.Z -= Atom.Rotation.Z;Rotation.W -= Atom.Rotation.W;}else{Rotation.X += Atom.Rotation.X;Rotation.Y += Atom.Rotation.Y;Rotation.Z += Atom.Rotation.Z;Rotation.W += Atom.Rotation.W;}Translation += Atom.Translation;Scale3D += Atom.Scale3D;DiagnosticCheckNaN_All();
}

3、为什么要动画混合

根源: 动画混合能将多个原始动画姿势混合在一起,创建出新的动画姿势

混合在游戏中的应用

游戏中我们看到的动画往往都不是一个完整的动画,而是由多个动画片段组合起来的,常用的混合方式有以下几种:

1、线性插值: 角色的Idle动作walk动作 ,游戏中当这两个动画切换的时候我们并不会看到很突兀地动作变化,因为在Idle动作walk动作 之间添加了混合(平滑过渡)

2、动画叠加: 在原有的动画上叠加上另一个动画,比如角色的 Idle动作装弹动作 ,我们假设 Idle动作 只有下半身在动, 装弹动作只有上半身在动,那么将两者叠加得到的就是一个下半身在做 Idle动作 而上半身在做 装弹动作 的融合动作

3、骨骼的分层混合: 可以理解为我们可以控制两个动画的两块对应骨骼,按照不同的权重进行混合!比如角色的 run动作装弹动作run动作 作为基础动作,取 装弹动作上半身的动作进行权重为1的融合,那么将两者叠加得到的就是一个下半身在做 run动作 而上半身在做 装弹动作 的融合动作

PS:“动画叠加” 和 “骨骼的分层混合” 的不同之处在于,“动画叠加” 是进行叠加,而“骨骼的分层混合”是进行混合
①“骨骼的分层混合”的能够在原有的动画的基础上得到更多选择的融合动画;
②“动画叠加” 也是有他的优势的,例如表情,游戏中人物的面部骨骼排布大体上都是一致的,我们完全可以做出不同的表情动画到不同的人物上进行叠加,相比“骨骼的分层混合”是要更快并且方便!

三、UE5上实现

1、将两个动画按照权重进行混合

UE动画蓝图提供了一个最基础的节点 混合(Blend),可以将多个动作按照权重混合创建出新的动作。如下图
黄色(dest):融合后的动画
绿色(A):"run"动画
紫色(B):"jump"动画
下图权重(weight):0.5

请添加图片描述
请添加图片描述

请添加图片描述
通过观察不难发现,其混合方式为:
dest = A ×(1-weight) + B × weight, 0<weight<1
dest = A, weight≤0
dest = B, weight≥1

2、线性插值

请添加图片描述

图二:未添加线性插值

请添加图片描述
图一:添加了线性插值

请添加图片描述

通过线性插值的方式,将源动画逐渐混合至目标动画,达到了平滑过渡的效果

骨骼动画A、B可以表示为如下
在这里插入图片描述
动画内每个骨骼关节的线性插值表示为如下
在这里插入图片描述
因此整个动画的插值表示如下
在这里插入图片描述
上述β为 混合因子,β∈[0,1],上述过渡一般采用的都是时间混合,即 β(t)=t−t1t2−t1β(t) = \frac {t-t_1}{t_2-t_1}β(t)=t2​−t1​t−t1​​

上述混合节点还提供了除线性以外的其他混合类型,此处不展开介绍
在这里插入图片描述

3、动画叠加

我们采用 趴下动作装弹动作 ,我们在 动画蓝图中创建这两个动画片段以及一个 应用叠加型姿势(Apply Additive)节点 如下
请添加图片描述
趴下动作(源动作):
请添加图片描述
装弹动作(叠加动作):
请添加图片描述
叠加后的动作:
请添加图片描述
需要注意的是,对于叠加动作,我们需要在其动画片段内将其设置为Addtive,如图
请添加图片描述
Addtive的类型还有“网格体空间”,对应的如下节点,其余用法相同
请添加图片描述

4、骨骼的分层混合

UE动画蓝图提供了节点 按骨骼分层混合(Layered blend per bone),可以用于基于指定的一组骨骼在任意数量的动态混合姿势之间进行混合。如下图
黄色(dest):融合后的动画
蓝紫色(BasePose):"run"动画
天蓝色(BlendPose):"装弹"动画
下图权重(weight):1
请添加图片描述
请添加图片描述
请添加图片描述
如上面最后一图可以看到,角色上半身运行的是 “装弹动作”, 下半身运行的是 “run”动作,由于**“装弹动作”** 的下班身动作被过滤了,上面的 黄色(dest) 和 蓝紫色(BasePose) 是重叠的!!

下面主要讲一讲 “骨骼的分层混合”中的 骨骼名称(Bone Name)、混合深度(Blend Depth) 两个参数
在这里插入图片描述
请添加图片描述
结合官方文档及代码可以理解 混合深度(Blend Depth)

骨骼名称(Bone Name) 开始的整条骨骼链参与混合,权重为1;Blend Depth = 0
骨骼名称(Bone Name) 开始到第N层依次参与混合,权重为weight(n)=nN,n为当前层数weight(n) =\frac{n}{N},n为当前层数weight(n)=Nn​,n为当前层数,即越下层的混合程度越深;Blend Depth = N(N≠-1 & N≠0)
骨骼名称(Bone Name) 开始的整条骨骼链不参与混合;Blend Depth = -1

针对 Blend Depth = N(N≠-1 & N≠0) 举个例子说明:
骨骼名称 = spine
混合深度 = 2

各层的权重如下:

├─spine (0.5)
│  ├─spine1 (1)
│  │  ├─spine2 (2)

UE的问答上的参考例子(可以对着看)
What does the ‘Blend Depth’ parameter in ‘Layered Blend Per Bone’ do

参考资料

UE5混合节点

相关内容

热门资讯

说方言郭德纲相声台词 说方言郭德纲相声台词  各位有认识我,有不认识。我是相声界非著名相声演员郭德纲。和小编一起来看看下文...
幼儿园毕业典礼主持稿开场白   幼儿园大班孩子即将挥别母校,那么在毕业典礼上应该如何说好主持词呢,以下是CN人才小编搜集并整理的...
小班元旦主持词 导语:幼儿园举办元旦晚会主持词怎么说?以下是小编整理的小班元旦主持词,欢迎阅读参考。小班元旦主持词a...
公司结训主持词 公司结训主持词  主持词要根据活动对象的不同去设置不同的主持词。时代不断在进步,各种场合中活跃现场气...
读书分享会的精彩主持词 读书分享会的精彩主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集会中,主持...
幼儿园运动会入场主持词 有关幼儿园运动会入场主持词(精选12篇)  契合现场环境的主持词能给集会带来双倍的效果。随着社会一步...
毕业30年同学聚会致辞 毕业30年同学聚会致辞  毕业30年同学聚会致辞    2013年7月13日下午在吉安市林业局食堂三...
报告会主持词 【精选】报告会主持词4篇  主持词没有固定的格式,他的最大特点就是富有个性。在当今中国社会,主持成为...
过界男女的经典台词及微影评 过界男女的经典台词及微影评  过界男女经典台词  1、因为李先生的户口被冻结了,所以暂时不能为你办理...
中秋节商务贺卡祝词 中秋节商务贺卡祝词把酝酿已久的创意交给秋风,任其去演绎相思的旋律;让翘盼团聚的心跃上太空,在月宫桂树...
谢师宴酒席致辞 谢师宴酒席致辞(精选5篇)  无论是在学校还是在社会中,说到致辞,大家肯定都不陌生吧,致辞具有“礼仪...
快板书武松打虎台词 快板书武松打虎台词  快板书是起源于山东省汉族传统曲艺形式,具有一百多年的历史。它最早流行于山东、华...
学校元旦晚会开场白主持词 学校元旦晚会开场白主持词  根据活动对象的不同,需要设置不同的主持词。在一步步向前发展的社会中,越来...
长辈证婚人证婚词 长辈证婚人证婚词各位领导、各位来宾、各位朋友、女士先生们:大家好!华灯初放、嘉宾盈门,我怀着兴奋的心...
元宵节主持词 元宵节主持词15篇  主持词要根据活动对象的不同去设置不同的主持词。在如今这个时代,各种场合中活跃现...
宗亲联谊大会主持词 宗亲联谊大会主持词  主持词要注意活动对象,针对活动对象写相应的主持词。在人们越来越多的参与各种活动...
和谐之声新春联欢会主持台词稿 和谐之声新春联欢会主持台词稿  (联欢会开场前60分钟内,所有接待、服务、道具、灯光、音响、服装、化...
遗体告别主持词 2021遗体告别主持词范文(通用5篇)  主持词是各种演出活动和集会中主持人串联节目的串联词。在当下...
颁奖典礼主持词 关于颁奖典礼主持词(通用5篇)  主持词是各种演出活动和集会中主持人串联节目的串联词。在各种集会、活...
高中学生家长会主持词 高中学生家长会主持词汇编  许多家长把注意力集中在孩子的学习上,其实,作为家长更应该从侧面关心孩子的...