2021SC@SDUSC

动画混合(animation blending)

指能令一个以上的动画片段对角色最终姿势起作用的技术。混合是把两个或更多的输入姿势结合,产生骨骼的输出姿势。比如,通过混合负伤及无负伤的步行动画,我们可以生成二者之间不同负伤程度的步行动画。动画混合可用于对面部表情、身体站姿、运动模式等的极端姿势之间插值。

动画混合也可以用于求出不同时间点的两个已知姿势之间的姿势。通过在短时间段内把来源动画逐渐混合至目标动画,就能把某动画圆滑地过渡至另一动画。

线性混合插值

将两个骨骼姿势

,通过线性插值找到它们中间姿势

则两个姿势中每个关节的局部姿势线性插值:

当整个骨骼插值后的姿势:

其中β为混合百分比混合因子;β∈[0,1]。至于对每个关节姿势的矩阵插值的处理方法,可以对它的SQT格式进行插值,这在前面数学基础中讲到。

线性插值混合的应用

时间性混合,即β的值和时间相关,例如要求Δt和2Δt之间的2.18Δt的时间处的姿势,可以求β = 0.18的线性插值。因此,要求时间点t1和t2之间的某个姿势采样,β可以这样求得:

动作连续性,当动画从一个片段过渡到另一个片段经常出现跳帧的问题。

为了在不同的动画片段之间平滑过渡,这里有三种级别的动画连续性:

  • 位置连续 C0连续(continuity):骨骼中每个关节移动时描绘的三维路径不含突然的“跳跃”。
  • 速度连续(位置的导数) C1连续,速度及动量的连续性:路径的第一导数也是连续的。
  • 加速度连续(速度的导数)C2连续

若使用更高阶的连续性,角色的动作会显得更佳及更真实。但是,通常难以达到严格数学上的C1或以上的连续性。通常使用线性插值(LERP)达到C0动作连续性就可以了。LERP混合即成为淡入/淡出。

两种常见的淡入淡出过渡方法

  • 圆滑过渡(smooth transition):播放片段A和B的同时把β从0增至1。这种做法要求两片段都是循环动画,且两片段同步到手脚位置大致匹配。
  • 冻结过渡(frozen transition):片段A的局部时钟停顿于片段B开始播放时。它适合混合两个不相关且不能再时间上同步的片段。

β 线性差值中的混合因子

为达到圆滑的过渡,我们可以令β按时间的三次函数变化,例如用一维贝塞尔曲线。当把这些曲线应用正在淡出的当前片段时,该曲线就称为缓出曲线(ease-out curve);当应用到正在淡入的新片段时,称为缓入曲线(ease-in curve)。

Bezier曲线如下:βstart为混合之始tstart的混合因子,βend为时间tend的最终混合因子,参数u是tstart和tend之间的归一化时间,v = 1 - u。

无需混合就能产生连续动作的方法:

动画师确保其片段的最后姿势能匹配后续片段的首个姿势。这种姿势称为核心姿势。具体的做法,创作一段圆滑的动画,然后把它切为两个或两个以上的动画片段。

方向性运动

  • 靶向移动:(有助于理解unity中的混合树(Blend Tree))

动画师制作3中不同的循环动画片段,包括向前、向左和向右移动,这些称为方向性运动片段。把它们排在半圆周上,分别对应0o、90o、-90o。角色面向0o方向,然后选择要求的角度的两个相邻的片段使用LERP方式混合,β是移动角度和相邻片段的角度求得。

  • 轴转移动

简单的播放向前运动的动画片段,同时以垂直轴旋转整个角色。

复杂的线性插值混合

泛化的一维线性插值混合中,可以定义一个参数b,它的范围任意,但是所有片段对应于该参数的某点上。(上面靶向移动的混合因子就是他的一个特例,b∈[-90o,90o])这样就可以通过b求出β:

简单的二维线性插值混合中,b变成了二维混合矢量b = [bx  by]。若b位于4个片段包含的正方形中:

  • 利用水平混合因子bx求出两个中间姿势,一个位于顶边的两个片段之间,一个位于底边的两个片段之间。它们可以通过一维LERP混合求得。
  • 然后利用垂直混合因子by,把两个中间姿势用一维LERP求得最终姿势。

若是3个片段,可以简单的使用三个权重:α、β、γ;α + β + γ = 1。

通过下面的公式求得它的姿势:

使用Delaunay三角剖分(Delaunay triangulation)可以得到泛化的二维线性插值混合。详细:http://en.wikipedia.org/wiki/Delaunay_trianglulation

骨骼分部混合

人可独立控制身体不同部位。例如,可以在步行时挥动右臂,并同时令左臂指着某物。在游戏中实现这种动作的方法之一是,使用名为骨骼分部混合(partial-skeleton blending)的技术。

混合遮罩(blend mask)可以把某些关节的混合百分比设为0,来掩盖那些关节。

现实中,在跑步中挥手时,挥手动作比站立时更“晃动”及不受控制,骨骼分部混合无法实现这样的真实性。另一种更自然的技术:加法混合。

加法混合(additive blending)

区别片段(difference clip)- 代表两段正常动画的区别。
考虑两个输入片段 来源片段(source clip S)、参考片段(reference clip R);概念上,区别片段 D = S – R
若区别片段D加进原来的参考片段,我们就会得到来源片段。只需要把某百分比的D加进R,我们也可以产生介于R和S之间的动画。就像线性插值。加法混合技术之美在于:制作一个区别片段之后,可以把该片段加进其他不相关的片段,而不仅限于原来的参考片段。

实际的数学公式,关节j的区别片段:

产生新的姿势Aj:

仅当输入片段S和R的持续时间相同,才能得到它们的区别动画。也可以加上加法混合百分比,修改两者的权重:

加法混合的局限

  • 在参考片段中,尽量减少髋关节的旋转;
  • 在参考片段中,肩及肘关节应该一直维持中性姿势;
  • 动画师应为每个核心姿势(站立、蹲下、躺下等)创建新的区别动画。

加法混合的应用

  • 站姿变化
  • 移动噪声
  • 瞄准及注视

Flag Engine(动画系统)学习笔记(八)——动画混合相关推荐

  1. Unity3D之Mecanim动画系统学习笔记(五):Animator Controller

    简介 Animator Controller在Unity中是作为一种单独的配置文件存在的文件类型,其后缀为controller,Animator Controller包含了以下几种功能: 可以对多个动 ...

  2. Unity动画系统学习笔记(一)动画剪辑与状态机

    一.动画系统工作流 一个完整的动画系统工作流包含如下几个部分: 动画剪辑(Animation Clips):包含某些对象如何随时间更改其位置.旋转或其他属性的信息. 状态机(Animator Cont ...

  3. Unity动画系统学习笔记(二)根运动、动画事件与状态机行为

    一.根运动 在学习根运动前需要了解两个名词: 身体变换:身体变换是角色的质心.它用于 Mecanim 的重定向引擎,并提供最稳定的移位模型.身体方向是相对于 Avatar T 形姿势的下身和上身方向的 ...

  4. ReactJS学习笔记八:动画

    ReactJS学习笔记八:动画 分类: react学习笔记 javascript2015-07-06 20:27 321人阅读 评论(0) 收藏 举报 react动画 目录(?)[+] 这里只讨论Re ...

  5. unity2D学习笔记-角色动画

    unity2D学习笔记-角色动画 角色移动 动画效果(重点!!!!!) 创建:Animator与Animation 状态转换 跳跃 从fall到idle Hierarchy中创建一个Sprite作为载 ...

  6. Unity动画状态机学习笔记

    Unity动画状态机学习笔记 一.建平面,拖人物模型.建状态机.动画导入.拖组件--实现Game时人物动画为等待状态. 二.拖WAIT01.WAIT02.WAIT03.WAIT04--实现按数字1切换 ...

  7. android学习笔记---55_frame动画的实现,Java技术qq交流群:JavaDream:251572072

    android学习笔记---55_frame动画的实现,Java技术qq交流群:JavaDream:251572072 Java技术qq交流群:JavaDream:251572072 2013/5/1 ...

  8. 学习笔记 JavaScript 动画

    学习笔记 JavaScript 动画 结果 代码里用到的图片 <html><head><style>#imageDiv {height: 100px;width: ...

  9. 学习笔记 JavaScript 动画 加速

    学习笔记 JavaScript 动画 加速 效果 代码中用到的图片 <html><head><style>#imageDiv {position: absolute ...

  10. Unity动画系统学习

    Unity动画系统学习 文章目录 Unity动画系统学习 AnimationState 动画状态 Animation Transitions 动画过渡 动画分层和遮罩 动画混合 1D混合 2D混合 动 ...

最新文章

  1. 如何将Swift数组转换为字符串?
  2. 23种设计模式(下)
  3. python 如何将代码中的输入保存到txt里边
  4. access驱动程序_Linux驱动程序学习二 (续) scull 源码在内核5.4.0上的编译调试
  5. 唯品会2017年双11大促技术保障实践,全域提供25万QPS服务能力
  6. MinGW 编译libwebsockets
  7. su - 提示失败问题[su方式]
  8. 分享我的Linux开发环境
  9. 音频频谱特效 jaVa_基于Matlab dsp工具箱 的实时音频采集及频谱显示
  10. JSP之实现分页查询
  11. Unity3D内存释放
  12. 龙芯 LS2K 16G 内存支持
  13. 36岁大龄程序员转岗做运营,最让我觉得有价值感的二三事!深度自问
  14. 博客园增加Live2D看板娘教程,超级简单,一看就懂
  15. 好看的常用背景色RGB数值
  16. 王烁30天认知训练营推荐书单
  17. 《18岁,你读了大学~》
  18. 第一章 简介(待续)
  19. 如何用js源生写计时器
  20. 英国电信集团、西班牙电话公司和澳洲电讯参与区块链试验

热门文章

  1. 用Java代码编程实现模拟机器人对话
  2. [FMG]ADT-eclipse升级为可以添加javaWeb
  3. 教程篇(5.4) 03. FortiManager 设备注册 ❀ Fortinet 网络安全专家 NSE5
  4. 大话设计模式三之单一职责原则、开放-封闭原则、依赖倒置原则、里氏代换原则
  5. 天津大学智能车队大一培训前准备(2022)
  6. 血泪史: k8s Initial timeout of 40s passed.
  7. 移动应用程序设计/开发:jQuery Mobile入门指南
  8. Python实现将多张图片拼接为一张
  9. 王者荣耀android看不见iOS,王者荣耀转区功能来了!iOS和安卓这个限制,终于消失了...
  10. 用夜神模拟器+GPA分析Android游戏