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

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

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

相关文章

weblogic集群配置信息,IIOP问题解决,节点配置管理

第一、创建域的时候,管理服务器,受管服务器,选择管理服务器,设置端口9001,其他默认下一步即可。 第二、启动管理服务器,打开控制台,增加服务器,集群如图,如果这两部有问…

RT-DETR算法优化改进:Backbone改进 | HGBlock完美结合PPHGNetV2 GhostConv

💡💡💡本文独家改进: GhostConv助力RT-DETR ,HGBlock与PPHGNetV2 GhostConv完美结合 推荐指数:五星 HGBlock_GhostConv | 亲测在多个数据集能够实现涨点 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-…

【FPGA】十进制计数器 | 实现 4-bit 2421 十进制计数器 | 有限状态机(FSM)

目录 Ⅰ. 实践说明 0x00 十进制计数器 0x01 有限状态机(FSM) Ⅱ. 实践部分 0x00 4-bit 2421 十进制计数器 Ⅰ. 实践说明 0x00 十进制计数器 十进制计数器是一种以十进制运算的计数器,从 0 数到 9,然后返回 0 状态。由于它需…

吃透 Spring 系列—IOC部分

目录 ◆ 传统Javaweb开发的困惑 -传统Javaweb开发代码分析-用户模块 -传统Javaweb开发困惑及解决方案 ◆ IoC、DI和AOP思想提出 - IoC 控制反转思想的提出 - DI 依赖注入思想的提出 - AOP 面向切面思想的提出 - 框架概念的出现 - 思想、框架和编码关系 ◆ Spring框架…

11-13 周一 同济子豪兄CNN卷积神经网络学习记录

11-13 周一 同济子豪兄CNN卷积神经网络学习记录 时间版本修改人描述2023年11月13日14:02:14V0.1宋全恒新建文档2023年11月13日19:05:29V0.2宋全恒完成 大白话讲解卷积神经网络的学习 简介 为了深入理解CNN,进行B站 同济子豪兄深度学习之卷积神经网络的学习. 主要内…

如何在电脑和手机设备上编辑只读 PDF

我们大多数人更喜欢以 PDF 格式共享和查看文件,因为它更专业、更便携。但是,通常情况下您被拒绝访问除查看之外的内容编辑、复制或评论。如果您希望更好地控制您的 PDF 或更灵活地编辑它,请弄清楚为什么您的 PDF 是只读的,然后使用…

NLP在网安领域中的应用(初级)

NLP在网安领域的应用 写在最前面1. 威胁情报分析1.1 社交媒体情报分析(后面有详细叙述)1.2 暗网监测与威胁漏洞挖掘 2. 恶意软件检测2.1 威胁预测与趋势分析 3. 漏洞管理和响应4. 社交工程攻击识别4.1 情感分析与实时监测4.2 实体识别与攻击者画像构建4.…

网络编程 初探windows编程

目录 一、什么是Winodws编程 二、开发环境搭建以及如何学习 三、VA助手安装 四、第一个Win32程序 五、窗口类句柄/窗口类对象 六、Winodws消息循环机制 七、Windows数据类型 一、什么是Winodws编程 Windows 编程指的是在 Microsoft Windows 操作系统上进行软件开发的过…

Spring IOC - BeanDefinition解析

1. BeanDefinition的属性 BeanDefinition作为接口定义了属性的get、set方法。这些属性基本定义在其直接实现类AbstractBeanDefinition中,各属性的含义如下表所示: 类型 名称 含义 常量 SCOPE_DEFAULT 默认作用域:单例模式 AUT…

《Semantics Disentangling for Generalized Zero-Shot Learning》论文解读

其实除了VAE自监督外,引入语义属性来约束生成特征的质量。感觉解纠缠这个说法有点扯淡。 语义相关模块的作用 其实就是把语义属性也作为标签。除了VAE外,加了语义属性作为标签,这样生成的特征就可以即跟原始视觉特征对齐,又跟语…

大数据治理运营整体解决方案:PPT全文39页,附下载

关键词:大数据,数据治理,数据治理解决方案,数据治理的目的和意义 一、数据治理的定义 数据治理专注于将数据作为企事业单位数据资产进行应用和管理的一套管理机制,能够消除数据的不一致性,建立规范的数据应…

5年测试经验之谈:2年功能测试、3年自动化测试,从入门到25k...

毕业3年了,学的是环境工程专业,毕业后零基础转行做软件测试。 已近从事测试行业8年了,自己也从事过2年的手工测试,从事期间越来越觉得如果一直在手工测试的道路上前进,并不会有很大的发展,所以通过自己的努…

Ansible角色定制实例

目录 角色定制:roles 角色定制实例:利用角色部署wordpress 1.在roles目录下生成对应的目录结构 2.定义配置文件 ①nginx ②php ③mysql ④定义剧本文件 ⑤启动服务 角色定制:roles 对于普通的剧本(playbook)有…

web前端开发第3次Dreamweave课堂练习/html练习代码《网页设计语言基础练习案例》

目标图片: 文字素材: 网页设计语言基础练习案例 ——几个从语义上和文字相关的标签 * h标签(h1~h6):用来定义网页的标题,成对出现。 * p标签:用来设置网页的段落,成对出现。 * b…

Linux下的文件系统

文章目录 一、初始文件系统 二、理解磁盘文件 三、了解磁盘 四、深入理解磁盘文件 4、1 磁盘分区 4、2 分区存储细节 4、3 磁盘文件的操作 4、3、1 查找某个磁盘文件 4、3、2 创建文件 4、3、3 对文件进行写入 4、3、4 删除文件 4、4 再次理解文件权限 🙋‍♂️ 作…

Spring 重点知识总结(三)——AOP

前言 基于黑马《SSM框架教程》的学习笔记,附链接:SSM框架教程 1 AOP 核心概念 AOP :(Aspect Oriented Programming)面向切面编程,是一种编程范式,负责指导开发者组织程序结构 同 OOP (Object …

AI图像生成模型LCMs: 四个步骤就能快速生成高质量图像的新方法

在最新的AI模型和研究领域,一种名为Latent Consistency Models(LCMs)的新技术正迅速推动文本到图像人工智能的发展。与传统的Latent Diffusion Models(LDMs)相比,LCMs在生成详细且富有创意的图像方面同样出色,但仅需1-…

python打包部署脚本

linux可使用expect来实现自动交互,windows想要写出同样的功能脚本,只能使用python或者安装ActiveTcl 1、安装python Microsoft Store搜索python直接安装,默认会直接添加到环境变量https://www.python.org/官网下载,点击安装时会提…

初识MySQL(一)(创建数据库,查看删除数据库,备份和恢复,创建表,数据类型)

目录 客户端 ------> MySQL服务(3306) 数据库三层结构-破除MySQL神秘 创建数据库 查看删除数据库 备份恢复数据库 创建表 MySQL常用的数据类型(列类型) ​编辑 ​编辑整型 bit类型 小数类型 字符串类型 日期类型的使用 客户端 ------> MySQL服务(3306) 连接…

【斗破年番】毒宗决战万蝎门,小医仙惨遭背叛,斗宗巅峰蝎毕岩

Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 深度爆料斗破年番第七十话剧情解析,万蝎门宗主蝎毕岩,也算是这片大陆上的一小小块势力。一年前,他曾与小医仙正面交锋,即使当时的蝎毕岩已经站在了四星斗宗&…