Games104——高级动画技术:动画树、IK和表情动画

这里写目录标题

  • 动画混合
    • 数学混合:线性插值
    • 混合空间Blend Space
      • 1D Blend Space
      • 2D Blend Space
      • Skeleton Masked Blending骨骼遮罩混合
      • Addictive Blending
  • 动画状态机Animation State Machine(ASM)
    • 动画状态机定义
      • 节点:分为clip和blend space。
      • Transitions
    • Cross Fades
  • 动画混合树
    • Layered ASM
    • 动画混合树
  • IK技术(Inverse Kinematics)
    • Two Bones IK
    • Multi-Joint IK
      • CCD(Cyclic Coordinate Decent)
      • FARBRIK(Forward And Backward Reaching Inverse Kinematics)
      • IK with Multiple End-Effectors
      • Other IK Solutions其他解决方法(了解)
  • 面部动画
  • 动画重定向
    • 同标准骨骼结构
    • 不同标准骨骼重定向
    • 动画重定向的挑战
  • 动画系统总结

动画混合

当我们知道了动画算法原理、有了各种动画切片素材(clips)后,怎么让这些动画自然地连接在一起,达到无极切换的效果呢?

数学混合:线性插值

不同于上节课的lerp(同一个clip内不同pose之间),动画blending需要在不同clip之间线性插值

计算权重:就跑步的案例来说,根据速度来变化两个clip之间的权重即可。
在这里插入图片描述
对齐混合时间线:要lerp两个clip动画,就需要2个动画的循环时间线是一致的,比如跑步是左右脚各一次循环,走路也得是,并且脚的落地时间一致,做到时间线对应,这样才方便归一化后用权重lerp。下图就是跑是走的速度的两倍时如何根据当前速度进行插值时时间线上的变化(其中length是指时间长短),delta time是指要去对应clip1和clip2的哪一个时间帧去取对应的pose。
在这里插入图片描述

混合空间Blend Space

1D Blend Space

比如在直走、向左以及向右等多个clip中的插值,由于变量只有一个移动方向,所以是一维的混合,但采样点可能有多个,并且插值也不一定是线性或均匀的
在这里插入图片描述

2D Blend Space

如果除了角度外,行走速度也可以变化,就变为了二维的Blend Space。

这里还涉及一些人体习惯,比如人侧向走时速度超过一个很低的阈值就无法保持平衡,会直接进入侧向跑的clip,因此clip的分布也是不均匀的,这时插值成本就比较高。我们可以采用 Delaunay Triangulation三角网格化的方法将这些clip化成不同三角形,然后根据当前的速度和方位确定当前的点在哪个三角形内。最后用重心插值对三角形的三个点(三个clip)进行插值。
在这里插入图片描述

Skeleton Masked Blending骨骼遮罩混合

很多动画是只影响局部的,比如鼓掌,这时如果想要不同姿势下的鼓掌怎么办?可以使用一个blend mask去遮住无关的部分,只对需要的部分进行blend,这样还可以减少blending的计算量,可以把两种及以上的动画进行混合
在这里插入图片描述

Addictive Blending

如果在这个基础上我还想要小人们都冲着我点头怎么办?
使用一个差值形成的difference clip,即加在其他clip上从而产生进一步效果的一种clip。使用时可以加上旋转或缩放来应用其效果。
在这里插入图片描述
addictive blending一般使用和制作的比较谨慎,因为随意增加差值容易带来人体超自然扭曲问题。因此在规划人体运动时,应该避免过渡叠加这种动画,避免关节异常。

动画状态机Animation State Machine(ASM)

当我们在进行动画设计和融合的时候,会发现有些动画clip是存在逻辑关系的而不是可以任意插值的,比如“跳”这个动作我们一般分为“起跳”、“滞空loop”以及"落地"三个部分,而且其存在明确的顺序关系。因而动画状态机就被引入了进来。

动画状态机定义

ASM包含“节点node”和“变换transitions”。
在这里插入图片描述

节点:分为clip和blend space。

节点可以指动画clip,也可以指把一整个blend space打包成的一个节点,甚至可以把一个动画蓝图放进去当一个节点,总之就是一个可以循环的state。

拿跳跃举例:当角色触发跳跃时,进入了jump start节点;当检测到运动到高点时,就进入jump loop节点循环;直到检测到快要落地时,进入landing节点,landing播放完后,重新进入idle(静息)节点。

Transitions

从一个节点到另一个节点涉及的blending的问题,这里经常会用到magic number 0.2秒去过渡。

但transitions的核心问题在于触发条件,什么时候转换节点,这个触发条件可能是很多个,见下文。

Cross Fades

Transition的时候,主要有两种方式:
在这里插入图片描述
常规的smooth transition:即像上述所讲的一样在符合可以同步前提下进行两个动画clip下的blending,动画1越来越少动画2越来越多。

Frozen transition:动画1先停住,动画2逐渐进来。
以“跑步”切换到“起跳”为例,使用smooth transition会感觉跳起来后仍有部分跑步的样子,使用Frozen transition则会有专门停下来跳起来的感觉。哪种效果好由艺术家决定。

cross fades的方式如下图所示有超多方法,动画技术主要使用linear和“easy in easy out(一般用cubic-bazier曲线表示)”(左边两种)
在这里插入图片描述
虚幻引擎中的动画节点和transition----老师认为比较下来UE的设计的非常好,很灵活可以自由组合,图标交互等很符合设计师直觉,可以参考该动画蓝图系统
在这里插入图片描述

动画混合树

Layered ASM

layered ASM是把角色的不同部位分成不同的状态机去使用,利用不同的状态机去管理身体的不同部分,从而让整个动画看起来更流畅和灵活,如图是鬼泣5的实现,其上半身一层进行复杂攻击,下半身一层进行跑跳,还有一层反应受击。
在这里插入图片描述
但随着技术的发展,现在普遍使用的是动画混合树。

动画混合树

动画混合树就是把Layered ASM的结构用树表示,如图,其中每个非叶节点的产出都是一个pose。

动画树的叶子节点与ASM的节点内容一样,是clip、blend space或者蓝图,所以叶子节点本身也可以是一个小动画树。

非叶节点是blend node,比较常用的有lerp(二通道lerp直接输入权重,多通道的权重另外输入)、相加(插值动画的addictive blend node)等。
在这里插入图片描述

动画树的核心作用是控制变量,动画树会定义大量变量暴露给外面的game play系统来进行控制(环境参数速度健康值、以及事件等),而这些变量的值决定了动画的混合行为。通过树的设计,我们只需设置这些变量的值就可以决定最终动画的展现。

类似不同水管之间的阀门,可以通过阀门的状态来决定不同颜色的水的混合,从而输出混合后的结果
在这里插入图片描述
变量有两种,一种是环境变量,速度健康值血量等;还有一类变量类似于类的private data,通过event事件触发去进行调整。当某件事发生的时候,会改变动画树中的某些变量,从而影响动画混合效果。

实际在引擎中计算每个节点的blending时,还会有专门的计算结构去计算其百分比

IK技术(Inverse Kinematics)

基本概念:前边介绍的根据动画移动到某个位置属于前向动力学(FK, Forward Kinematics),而根据要到的位置设计动画属于反向动力学IK,从子节点位置反向去计算父节点位置,通常用于处理环境或是其他因素对角色的约束。

IK问题的经典例子是用手抓把手或者走在不平的地上,这时的约束点手腕被称为末端效果器(end-effector)。

Two Bones IK

在这里插入图片描述
例如走路,大腿、小腿长度a\b固定,如果确定了最后要踩在哪个位置,胯部到阶梯处的距离c也可以计算,那么三条边都知道就可以唯一确定一个三角形,就可以确定大腿抬起的角度θ。
在这里插入图片描述
但由于这样求解本质是求两个球的交点,会存多个解的问题(因为三角形是平面的,但实际大腿还可以z方向转动,可以变成正弯或者内八外八,因此解是一个圆环)。这时就需要让艺术家提供一个参考方向向量reference vector,在这个方向上找到解。

Multi-Joint IK

在实际情况中 IK 远比这个复杂。实际中参与这个 IK 的关节点不止两个,主要有两个难点:

自由度太高,计算花费高:需要实时计算多维的非线性(包括旋转、平移、放缩)函数的解。
解有无穷多个:确定了首尾两个目标点,中间的关节点可以随意移动。
此时首先要做的第一步是判断可达性(Reachability),而不能达到分两种情况:

所有关节的长度加起来也达不到目标点(太远)
全身最长的骨骼比其他骨骼的长度加起来都大—近处盲区。(太近)
在这里插入图片描述
其次很重要的一点是人体骨骼的旋转是有限的,就比如手指的指节处的关节只能沿握手方向转动,而且该旋转的角度也有限制。错误的处理会导致很离谱的扭曲。

那么具体怎么处理呢?由于直接求解高维非线性方程存在的问题,所以在工程中开发出了一些实际好用的方法如下:

CCD(Cyclic Coordinate Decent)

该方法的主要思路是从最末端节点开始向父节点依次遍历,每一次都将末端节点旋转到离目标点最近的位置(该节点与目标点连线上),经过多次迭代可以得到一个近似解。—计算简单,最经典方法
在这里插入图片描述
可达性上,一般认为超过设定迭代次数还没有收敛时,就认为不可达。

优化点:

限制每次旋转的角度(within tolerance regions公差范围),从而让整个旋转尽量均摊到每个joint上。
让越靠近根节点的joint旋转角度越小等
在这里插入图片描述
在这里插入图片描述

FARBRIK(Forward And Backward Reaching Inverse Kinematics)

意译就是:向前迭代一遍再向后迭代一遍,来解决IK这个问题
在这里插入图片描述

具体步骤:

forward:先把从最后一个节点强行拉到目标位置,这时骨骼会变长;然后再把上一个节点移动到两节点原骨骼长度的位置,这时与下一个骨骼的长度又会变长;再移动下一个节点到原骨骼长度为止……如此反复,直到根骨骼也被移动
backword:反向进行forward的步骤,先把根节点移回原位置,最后移动末端节点
多次重复1、2步骤,末尾节点就会很接近目标位置了。

CCD和FARBRIK都不能保证完全指向目标点,需要设置公差范围
和CCD一样可以限制旋转角度,只需每次移动时移动到限制范围的垂直投影上:
在这里插入图片描述

IK with Multiple End-Effectors

前边都只是单一约束点的例子,但实际中经常有多个约束点,比如爬墙攀岩时,双手双脚都被约束了。这时当我们试图把一个点移到它的目标点时可能会让其他已经到位的节点又偏移开。在 CCD 和 FABRIK里也有解决方法,但是不是最优解。

推荐使用雅可比矩阵Jacobian Matrix方法解决,在后续物理系统会详细介绍。
在这里插入图片描述

Other IK Solutions其他解决方法(了解)

Physics-based Method:更自然,但是如果没有优化,需要耗费大量的计算。

PBD(Position Base Dynamics):和传统的基于物理的方法不同,有更好的视觉表现,以及更低的计算花费。
在这里插入图片描述

目前IK 的挑战:

IK是假设骨骼本身没体积的,但实际上是有的,尤其在蒙皮之后,所以会出现IK后骨骼自我穿插等、重叠等问题。
游戏中人物碰到障碍物如洞穴,自然作出下蹲动作,这是设计师提前设计好的。而如果想用IK做到像人那样看到一个物体就就知道提前作出对应动作还是很难的。
需要更自然的人物的行为:中心平衡、支撑等。
IK技术近10年还在快速发展,感兴趣又数学好的同学可以关注这个方向

由于IK技术会改变动画的pipeline,因此十分重要
在这里插入图片描述

面部动画

人的表情是由43块肌肉横向纵向共同作用组成的,许多微表情非常难以表现。

Facial Action Coding System是电影行业提出的,它把人类常用的表情归纳成了46种标准表情单元(AU, Action Unit),这些 AU 可以融合的。后来 Apple 又把这46个 AU 归纳成28个最核心的AU,其中23个是对称的,这时只要使用28个表情的AU的差值顶点动画(BS)进行融合(一般additive就行)就可以组合成各种表情了----Morph Target Animation。
在这里插入图片描述

但这种方式存储量大,并且随着表面细节增多计算量也会变很大。

因此实际引擎中还是会用骨骼做大量的角色动画,比如眼球旋转、大幅度动作和捏脸系统,都需要用到骨骼

针对二维动画,UV Texture Facial Animation也经常使用,它是将不同的纹理贴图来代表不同的表情
在这里插入图片描述
另外Muscle Model Animation也在发展中(主要在影视行业),它是直接基于物理去驱动面部的43块肌肉来实现各种表情。
在这里插入图片描述

动画重定向

现在大多数动画都采用动作捕捉来获取,那我如何将采集到的一套动画能够应用到不同角色上?

一些术语(terminology):
Source Character 原角色
Target Character 目标角色
Source Animation 原角色动画
Target Animation 目标动画
在这里插入图片描述

同标准骨骼结构

基本操作是将他们的骨骼一一对应,无视具体长短等强行对应

对于骨骼的旋转来说,它基于原角色的 Bounding Pose来发生改变,也就是应用的是相对角度;对于平移和放缩,我们考虑两个骨骼的相对长度,然后按照长度进行等比例进行的改变。
在这里插入图片描述

对于角色的移动来说,我们还需要注意角色的离地高度的不同,对其作出适当的调整。比如说,我们以角色腰线高度为准,将角色的高低进行适当调整,并且一般位移的速度也会根据腰线高度适当放缩。
在这里插入图片描述

还有一些特殊情况我们会用 IK 来解决。如下图,总腿长一致但大小腿长度不同的角色,他进行一个蹲的的时候会有问题,此时会用IK解决这个问题 , 把脚锁在地面上。-----一般游戏角色固定,会离线做好重定向
在这里插入图片描述

不同标准骨骼重定向

上述所有都是基于大家骨骼架构整体相同的前提,但实际游戏中经常会有不同的,这时候怎么处理呢?
在这里插入图片描述
NVIDIA方法:找到对应的两组骨骼,它们之间的骨骼数可能不同(如上图source是四块,target是三块),先把骨骼都长度归一化;针对target骨骼,去找每个骨骼对应source的位置,并适当调整;比如图上黄色第一根骨骼对应0-0.3部分,就把他调整到source的0.0-0.3的位置。

动画重定向的挑战

角色的自穿插(瘦角色和胖角色,瘦角色走路手放在两侧可能刚好,但是胖角色就会穿模)
自接触的约束(由于肩宽问题,源角色动作没问题,但是由于肩宽不同,目标角色可能会发生两个手掌碰不到的问题)
角色的平衡
在这里插入图片描述

表情领域也面临动画重定向问题,比如小眼睛的闭眼动画到大眼睛的模型上就闭不上眼,这时可以利用拉普拉斯算子模拟橡皮表面把顶点拉到闭合。
在这里插入图片描述

动画系统总结

  • Animation Blending非常重要,连接了我们的Gameplay和动画系统,FK的核心系统让我们输出了一个基础的人物动作
  • 因为人物需要与环境有互动,所以给人物加上一个反向约束让他与环境的互动更加真实(IK)
  • 骨骼加Morph target animation能实现人物更精细的表情表达
  • 通过重定向让有限的动画在不同人物上都能实现

参考文章链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960656.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rust自学】15.6. RefCell与内部可变性:“摆脱”安全性限制

题外话,这篇文章一共4050字,是截止到目前为止最长的文章,如果你能坚持读完并理解,那真的很强! 喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以…

lightweight-charts-python 包 更新 lightweight-charts.js 的方法

lightweight-charts-python 是 lightweight-charts.js 的 python 包装,非常好用 lightweight-charts 更新比较频繁,导致 lightweight-charts-python 内置的 lightweight-charts 经常不是最新的。 新的 lightweight-charts 通常可以获得性能改进和bug修复…

2025多目标优化创新路径汇总

多目标优化是当下非常热门且有前景的方向!作为AI领域的核心技术之一,其专注于解决多个相互冲突的目标的协同优化问题,核心理念是寻找一组“不完美但均衡”的“帕累托最优解”。在实际中,几乎处处都有它的身影。 但随着需求场景的…

Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

第4章 神经网络【1】——损失函数

4.1.从数据中学习 实际的神经网络中,参数的数量成千上万,因此,需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量,特征量指的是从输入数据/图像中提取出的本质的数 …

深度学习|表示学习|卷积神经网络|详细推导每一层的维度变化|14

如是我闻: 一个经典的卷积神经网络(CNN)架构,呈现的是输入图像通过多个卷积层、池化层以及全连接层,最终输出分类结果的过程。整个过程的核心是理解输入特征图的尺寸如何在每一层发生变化,我们可以通过卷积…

java基础——专题一 《面向对象之前需要掌握的知识》

目录 Δ前言 一、拾枝杂谈 1.Java是什么? 2.计组前瞻: 3.JDK,JRE,JVM? 二、环境搭建 1.JDK安装和配置: 1.1 人话 1.2 JDK的配置 1.3 如何切换JDK的版本? 2.DOS的简单使用: 2.1 介…

强化学习数学原理(三)——值迭代

一、值迭代过程 上面是贝尔曼最优公式,之前我们说过,f(v)v,贝尔曼公式是满足contraction mapping theorem的,能够求解除它最优的策略和最优的state value,我们需要通过一个最优v*,这个v*来计算状态pi*&…

2025蓝桥杯JAVA编程题练习Day1

1.刑侦科推理试题 题目描述 有以下10道单选题,编程求这10道题的答案。 这道题的答案是: A. A B. B C. C D. D 第5题的答案是: A. C B. D C. A D. B 以下选项中哪一题的答案与其他三项不同: A. 第3题 B. 第6题 C. 第2题 D.…

内存泄漏的通用排查方法

本文聊一聊如何系统性地分析查找内存泄漏的具体方法,但不会具体到哪种语言和具体业务代码逻辑中,而是会从 Linux 系统上通用的一些分析方法来入手。这样,不论你使用什么开发语言,不论你在开发什么,它总能给你提供一些帮…

定时器按键tim_key模版

低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内,会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…

MacOS 如何解决无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件

背景 在安装软件时,遇到“无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件” 的提示,许多用户可能会感到困惑,不知道该如何处理。遇到这个问题时,按以下步骤操作即可解决。 首先,这个警告提示的出…

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题,因为数据范围的不同要用不同的方法进行求解,涉及了很多之前的东西快速幂,逆元,质数,高精度等…

柔性数组与c/c++程序中内存区域的划分

1.柔性数组 1.1柔性数组的定义 柔性数组是指在结构体中定义的,其大小在编译时未确定,而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下: struct D {int a;int arry1[0]; };struct F {int a;int arry2[]; };…

Vivado生成X1或X4位宽mcs文件并固化到flash

1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型,相关配置步骤可参考下图。 注意:Flash数据传输位宽如果需要选择X4位宽&am…

云原生:构建现代化应用的基石

一、什么是云原生? 云原生是一种构建和运行应用程序的方法,旨在充分利用云计算的分布式系统优势,例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点,能够更好地适应云平台的动态变化&…

力扣动态规划-12【算法学习day.106】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…

day7手机拍照装备

对焦对不上:1、光太暗;2、离太近;3、颜色太单一没有区分点 滤镜可以后期P 渐变灰滤镜:均衡色彩,暗的地方亮一些,亮的地方暗一些 中灰滤镜:减少光差 手机支架:最基本70cm即可 手…

解锁微服务:五大进阶业务场景深度剖析

目录 医疗行业:智能诊疗的加速引擎 电商领域:数据依赖的破局之道 金融行业:运维可观测性的提升之路 物流行业:智慧物流的创新架构 综合业务:服务依赖的优化策略 医疗行业:智能诊疗的加速引擎 在医疗行业迈…

LosslessScaling-学习版[steam价值30元的游戏无损放大/补帧工具]

LosslessScaling 链接:https://pan.xunlei.com/s/VOHc-yZBgwBOoqtdZAv114ZTA1?pwdxiih# 解压后运行"A-绿化-解压后运行我.cmd"