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…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...