BlendTree动画混合算法详解
【混合本质】
如果了解骨骼动画就知道,某一时刻角色的Pose是通过两个邻近关键帧依次对所有骨骼插值而来,换句话说就是由两个关键帧混合而来。
那么可不可以由多个关键帧混合而来呢?当然可以。
更多的关键帧可以来自不同的动画片段(AnimationClip),混合时给予每个动画片段的权重不同,但权重之和仍然为1。
我们可以预先指定混合时需要哪些动画片段,通过混合算法在运行时计算每个动画片段的权重。
通过混合可以用有限个动画片段混合出多种角色状态,进而减少动画片段的制作。
混合一般用于角色运动locomotion。
【一维线性插值混合】
一维线性插值混合要求不同动画片段只有一个属性不同,例如角色运动的速度和朝向不同。
以速度为例,有五个动画片段,速度分别是1 2 3 4 5m/s,将不同动画片段按照属性的大小从左到右排成一行。
那么该BlendTree有五个AnimationClip,记录了每个AnimationClip的属性,自身有一个属性参数speed。
运行时角色的运动速度会变化,角色速度的值即为该BlendTree的Speed属性当前的值。
可以从五个AnimationClip中找到当前速度邻近的两个,这样就找到了运行时需要参与混合的动画片段。
(注意,当前速度小于动画片段的最小值,或者大于最大值,那么邻近的动画片段只有1个了,不用混合了)
接下来需要确定两个动画片段的权重分别是多少。显然根据两个动画片段的速度值和当前的速度值,可以确定不同动画的权重。(如何这里看不懂怎么确定的,请先了解下线性插值)
【二维双线性插值混合】
双线性插值需要四个点,Q11、Q21、Q12、Q22。
有一个插值系数a1,让Q11和Q21完成线性插值得到R1,Q12和Q22同样用a2完成线性插值得到R2。
有另一个插值系数a2,让R1和R2完成线性插值得到P
在动画混合中,四个点就表示四个动画片段,X轴和Y轴表示角色运动的两个属性,以速度和朝向为例,a1和a2是运行时根据角色当前的速度和朝向,以及动画片段的属性计算出来的。这个坐标系叫做参数空间parameter space
其中,因为存在公用a1和a2的问题,假设a1对应速度属性,a2对应朝向属性。则要求动画片段Q11和Q12、Q21和Q22相互间速度属性不同,Q11和Q12、Q21和Q22相互间朝向属性不同。
也即,两个属性的两个不同值,对应4个动画片段。
如果两个属性分别由N、M个不同的值,则对应N*M个动画片段。
在实际运行时,需要先根据属性值知道四个动画片段,分两次找,每次找的方式与一维线性插值混合找的方式相同,然后进行双线性插值,得到最后的角色Pose
【二维三角形插值混合】
线性插值是用两个已知点插值计算出一个未知点。当然也可以用三个已知点插值计算出一个未知点。
y = a * y1 + b* y2 + c* y3。一般的,a + b + c = 1.
因此,要计算出插值结果,需要先算出两个未知数a和b。
这恰好可以通过三角形的重心坐标算出:二维坐标系中三个已知点可以组合出来三个向量,向量点乘算出面积,面积之比算出未知数。
在动画混合中,三个点代表三个不同的动画片段,点的坐标是动画片段的属性值。
如果有很多个动画呢?如同二维双线性插值混合中的做法,先找到要参与混合的三个动画片段。
如何找?
我们通常假设在坐标原点附近(最好就是在坐标原点)有一个中心动画片段,这个片段一般为类似Idle的动画片段,叫做中心点。
中心点和所有其他点(也叫采样点)都有一个连线,通过判断运行时传过来的两个属性值构成的点(也叫目标点)位于哪两条连线形成的夹角之间即可。
如何判断?向量叉乘可以判断点在直线的左侧还是右侧。
【更复杂的插值混合】
上述三种混合算法都是比较容易想到、容易理解的算法,真正进行混合时,实际参与混合的动画片段为2或3个。如何希望有更多的动画片段参与混合,那么如何给定每个参数的权重值?
这实质上是一个离散数据插值问题,这里有一个基本假设,假设某个采样点对目标点的影响因子为h,所有采样点影响和为H,那么采样点的权重w = h/H。
注意如果H = 1,那么影响因子就是权重了。
我们只需要找到如何计算影响因子h即可,前面三种简单的方式也是如此,插值方法如下:
- 反距离权重插值Inverse Distance Weighted Interpolation
- 自然邻近插值Natural Neighbors Interpolation
- 径向基函数插值Radial Basis Function Interpolation
- K邻近插值K-Nearest-Neighbors Interpolation
- 梯度带插值Gradient Band Interpolation
【反距离权重插值】
计算所有采样点到目标点的距离,影响因子为距离的倒数 h= 1/distance(s,p)
可以看到距离目标点越近的采样点影响因子越大。
为了减少计算量,可以
1.限制有点的影响距离D,超过该距离,认为不会产生影响
2.不算距离,取距离的平方
【自然邻近插值】
自然邻近插值基于面积(area-based),首先要算出每个采样点的影响面积,采用维诺图算法计算。
随后计算加入目标点后,目标点与周围点形成的维诺图
目标点维诺图和周围点维诺图的重叠面积即为影响因子,如图所示:
这种方式计算量大,不适合实时计算。
【径向基函数插值】
学过线性代数,我们知道,在向量空间中,任意一个向量都可以用一组基向量的线性组合表示,二维向量空间的基向量个数为2,三维向量空间的基向量个数为3,N维向量空间的基向量个数为N
在函数空间中,任意一个函数都可以用一组基函数的线性组合表示。
径向基函数是取值仅依赖于到原点距离的实值函数。仅依赖表示函数只有一个自变量,为该点到原点的距离,注意原点不是坐标系的原点,原点是我们自己选的。到原点的距离一般指欧式距离,也即我们常用的计算两个点距离的方法。
基本的径向基函数有:
在动画混合中,目标点就是原点,根据其他点到原点的距离以及径向基函数可以计算出来影响因子的值。
【K邻近插值】
类似反距离权重插值,这里只选择距离目标点最近的K个采样点参与实际的混合,第K个采样点的权重为0,更远的采样点的权重也为0。影响因子的计算与反距离权重插值相同。
【梯度带插值】
有三个点O、A、B,在一维线性插值混合中,他们在一条直线上,通过判断O点到A点、O点到B点的距离来计算每个点的影响因子,那么A点和B点的影响因子分别为(此时权重值等于影响因子的值)
h(A) =1 - OA/AB h(B) =1 - OB/AB。
注意如果O在A点左边,那么A的影响因子为1,B的影响因子为0。反之亦然。
如果O点不在AB所在的直线呢?
这时计算距离,要多一个O到AB所在直线的距离。这一项对A点和B点一样,可以抵消掉。我们只要得到O点分别到A点和B点的水平距离即可,用同样的公式可以得到A和B对O的影响。
这个距离如何求?可以看到这实际上是在求向量OA在向量AB上的投影长度。(不知道怎么计算投影长度可以先学习下),随后可以得到h(A)、h(B)
h(A)即为相对于B点,A点对O点的梯度值。如果还有C、D、E点,可以求出相对于这些点,A点对O点的梯度值。
从这些梯度值中,找到最小值,即为在所有采样点中,A点对目标点的影响因子,用公式表示为:
对于已经给定的采样点,如果目标点是未知数,可以计算得到某个采样点关于目标点的梯度值分布(即梯度带),如下图所示:
可以看到P1在紫色三角形的顶点附近,仍然存在一定的影响,对含有速度的混合而言,可能不希望受到P1的影响。
这时需要在计算影响因子时考虑角度。角度时目标点P与某个采样点A所在向量的夹角,夹角越小,影响越大。
同样的,如果原点为O,如果点P在直线OA左侧,采样点B在直线OA右侧,那么A点的权重应该为1。
如何综合距离和角度计算影响因子?参考极坐标系的方式,建立一个速度和角度的坐标系,求出目标点和采样点在该坐标系中的位置,再做基于距离的梯度带差值。也即,修改向量的坐标表示方式,如下图所示,其中α是控制因子。
【动画混合中权重算法的评价标准】
- 准确性:如果目标点与某个采样点重合,那么其权重必须为1,其他采样点权重为0。实际上,如果目标点靠近采样点的某个小范围内,那么将目标点和采样带你视为重合。这样做的目的是保留动画师愿意的原始动作。而在回归分析中,会通过统计方法估计出一个最佳的拟合值。
- 累加和:所有权重累加和必须为1
- 连续性:权重函数要具有C0连续性,目标点小的变化只能使权重的变化小,否则会引起混合动作的抖动
- 有界性:所有权重都要在0和1之间,否则会混合出不可预测和不理想的结果
- 局部性:只有目标的附近一定范围内的采样点的权重会大于0,其他采样点的权重为0,这可以提高混合效率。
- 单调性: 每个权重函数应该从其全局最大值递减到全局最小值。严格来说,权重函数不应该有局部最小值。例如,一个奔跑动作的权重应该随着速度从奔跑速度降低到行走速度而从1递减到0。
- 密度不变性:对分布均匀和不均匀的采样点有同样的效果,不应该对附近采样点多的地方比同样邻近的单个采样点更大的权重
【参考】
Unity - Manual: 2D Blending
《游戏引擎架构》
Automated Semi‐Procedural Animation for Character Locomotion
相关文章:

BlendTree动画混合算法详解
【混合本质】 如果了解骨骼动画就知道,某一时刻角色的Pose是通过两个邻近关键帧依次对所有骨骼插值而来,换句话说就是由两个关键帧混合而来。 那么可不可以由多个关键帧混合而来呢?当然可以。 更多的关键帧可以来自不同的动画片段…...

2013年01月16日 Go生态洞察:并发不是并行
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

CRM销售管理软件哪个好,该如何选择?(一)
销售团队对于任何一家企业来说都是重中之重,因此我们说一款可以辅助销售人员维护好客户的工具是企业发展的刚需。那么CRM销售管理软件哪个好,该如何选择,从从哪里方面去入手?来看看这两点吧: 功能方面 完整的功能可以…...

Django路由层解析
路由层(urls.py) Django的路由层是用于将URL映射到视图函数的机制。它用于确定请求URL(HTTP请求)应该被哪个视图函数处理。 Django的路由层包括两个部分: URL模式:匹配请求URL,决定应该使用哪个视图函数来处理请求。UR…...
高教社杯数模竞赛特辑论文篇-2023年A题:定日镜场的输出功率优化(附获奖论文及MATLAB代码实现)(中)
目录 6.4定日镜平均输出热功率优化模型的求解 6.5问题二求解结果 6.6 结果分析...

libusb获取Windows设备实例路径DevicePath
libusb 当前版本(1.0.26)libusb.h 头文件提供的接口似乎没有办法获取 Windows 平台相关的设备实例路径,其形如: \\?\usb#vid_04ca&pid_7070#5&20d34a76&0&6#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 只是提供了…...

File Upload
File Upload File Upload(文件上传),Web应用程序的安全漏洞,如果应用程序未能正确验证和限制用户上传文件的类型、大小和内容。攻击者可以通过构造特制的文件来绕过这些验证,上传包含恶意代码的文件,并在服…...
Qt数据库之QTabelModel
QTabelModel的好处就是不需要执行sql语句就可以对数据库进行操作。 创建数据库: QSqlDatabase DB;//数据库连接 QString aFileQFileDialog::getOpenFileName(this,"选择数据库文件","","SQL Lite数据库(*.db *.db3)"); DBQSqlData…...

计算机视觉(CV)技术的优势和挑战
计算机视觉技术在很多领域具有很大的优势,例如: 自动化:计算机视觉技术可以帮助实现自动化生产和检测,省去了人力成本和时间成本。 准确性:计算机视觉技术可以提高生产和检测的准确性,降低了人工操作产生的误差。 速度:计算机视觉技术可以实现高速速度的生产和检测,提高…...
面试官:【后端一次性返回10万条数据怎么处理/后端发送大数据量的数据如何处理】
文章目录 前言定时器分片处理文档碎片懒加载后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端系列文章 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误…...
深入理解强化学习——多臂赌博机:梯度赌博机算法的数学证明
分类目录:《深入理解强化学习》总目录 通过将梯度赌博机算法理解为梯度上升的随机近似,我们可以深人了解这一算法的本质。在精确的梯度上升算法中,每一个动作的偏好函数 H t ( a ) H_t(a) Ht(a)与增量对性能的影响成正比: H t …...

StackExchange.Redis 高并发下timeout超时问题如何解决?
查看服务端程序负载还行,根据打印的连接看到一知半懂,按GitHub的issue提示,这2个Busy的数量不能比Min的大,即要提示Min的数值; 的各个字段: Timeout performing EXEC (1000ms): 表示在执行一个事务(MULTI..…...
JAVA基础7:数组
1.数组定义格式 1)数组概述 一次性声明大量的用于存储数据的变量 要存储的数据通常都是同类型数据,比如:考试成绩 数组(array)是一种用于存储多个相同类型数据的存储模型 2)数组定义格式 格式一:数据类…...

Riskified: 2023年电商政策滥用问题恶化,正严重挑战商家盈利底线
2023年11月14日,中国上海 —— 近日,由全球领先的电子商务欺诈和风险智能解决方案提供商 Riskified 发布的《政策滥用及其对商家的影响:2023年全球参考基准》报告显示,政策滥用问题正进一步恶化,超过九成电商商家正在承…...

【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields
https://cvlab-unibo.github.io/xnerf-web intro 从不同的light spectrum sensitivity获取信息,同时需要obtain a unified Cross-Spectral scene representation – allowing for querying, for any single point, any of the information sensed across spectra。…...

Huggingface
1 介绍 Hugging Face 是一个开源模型社区。目前已经共享 300k 模型,100k 应用,50k 数据集(截至 231114 数据),可视为 AI 界的 github。 2 官网 https://huggingface.co/ 3 主要功能 3.1 Models 模型 大家都用过就…...

【深度学习】pytorch——常用工具模块
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 深度学习专栏链接: http://t.csdnimg.cn/dscW7 pytorch——常用工具模块 数据处理 torch.utils.data模块DatasetDataLoadersamplertorch.utils.data的使用 计算机视觉工具包 torchvisiontorchvision.d…...

【Android】统一系统动画
需求:除panel动画效果为弹出之外,其余的应用效果为渐入渐出 从系统层面统一把控动画效果,而不是单个应用自己处理 Android系统版本:9.0 代码地址 \frameworks\base\core\res\res\values\styles.xml 当时看注释,以为…...

京东数据运营与分析:如何全面获取电商销售数据?
随着电商行业的快速发展,数据分析成为了电商运营中一个非常重要的环节,这一环往往能够帮助品牌方来提升销售业绩和管理效率。然而,如何获取到电商平台中详细、全面的销售数据是很多电商品牌方所关心的问题,事实上,第三…...

du_命令可以像find_命令那样列出最大的文件吗
【赠送】IT技术视频教程,白拿不谢!思科、华为、红帽、数据库、云计算等等_厦门微思网络的博客-CSDN博客文章浏览阅读418次。风和日丽,小微给你送福利~如果你是小微的老粉,这里有一份粉丝福利待领取...如果你是新粉关注到了小微&am…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...