Unity动画和动捕衔接的方法

Xsens动作捕捉 2022-10-09 29855

Unity动画和动捕衔接的方法  第1张

本文主要介绍Unity不同的动画系统之间的衔接、和虚拟偶像的动作绑定的衔接之间的问题,将从Unity动画系统的介绍和显示,动画系统的分类和结合等出发进行阐述,希望能给相关的同学一些启发~

  01.Unity动画 & 动捕

1/ 介绍

动画: 是对一个以时间为横轴的函数进行采样,获得某个时间点的值,应用到目标上,产生连续的画面从而实现动画的效果。
无论Unity动画还是其他系统动画(Android,ios等),基本上都是在横轴的函数,及获得某个时间点的值上进行优化,实现效率提升。
动捕: 通常是指在3D游戏或动画中,通过传感器和软件,把真人演员的动作转录成数字模型的动作。
目前我们程序采用的是光学式动作捕捉系统,基于二维图像特征进行对动作的赋值。每一个时间节点,对每一个关节进行赋值。

2/统一-显示

Quality Settings中有个VSync Count属性可以设置VSync,分别是:
1,Dont Sync(关闭VSync)
2,每个 VBlank(每个 VBlank 计算一帧)
3,每秒 VBlank(每两个VBlank计算一帧)

Unity动画和动捕衔接的方法  第2张


  02.统一动画系统

1/动画系统分类

Legacy:老的动画系统,配合Animation组件实现动画播放。
Generic:是新的动画系统,支持非人形的动画,不能像Humanoid重定向动画。配合Animator动画状态机。
Humanoid:人形重定向动画系统。配合Animator动画状态机
Unity现存两套动画系统:Legacy动画系统和Mecanim动画系统。Legacy动画系统功能相对简单,核心组件Animation;Mecanim动画系统是Unity当前主要的动画系统,在Legacy动画系统上增加很多新的概念,功能相对复杂,核心组件Animator。
2/动画师状态机
一类模型(骨骼结构相同)可以共用同一个动画状态机

Unity动画和动捕衔接的方法  第3张

 Unity动画和动捕衔接的方法  第4张 Unity动画和动捕衔接的方法  第5张1.角色挂上动画脚本
2.场景管理器中挂上AnimatorTest脚本
骨骼的本质,其实就是一个坐标空间,我们在做骨骼动画的时候,关键帧中包含的对骨骼的变换主要为旋转矩阵,所以对骨骼的变换就是对骨骼空间的旋转变换。说简单点,一个骨骼动画,带来的变换,首先作用在根骨骼上,影响根骨骼的坐标空间,然后递归的影响根骨的子骨骼,这样层层的递归影响,最后带来的就是整体骨骼变换。
3/动画 旧版动画系统
1.FBX导入设置为Lagecy
2.角色挂上Animation脚本
3.角色挂上Controller脚本
在关键帧动画中,模型在每个关键帧中都是一个固定的姿势,相当于一个“快照”,通过在不同的关键帧中进行插值平滑计算,可以得到一个较为流畅的动画表现。关键帧动画的一个优势是只需要做插值计算,相对于其他的动画计算量很小,但是劣势也比较明显,基于固定的“快照”进行插值计算,表现大大被限制,同时插值如果不够平滑容易出现尖刺等现象, 同时一个无法忽略的问题就是,对于每帧动画都需要进行内存占用,在帧数较多和顶点数较多的时候,这会带来极大的内存占用。当然帧动画也有其实际的应用场景,目前在一些模型的表情动画中会较多的应用到帧动画,因为其动画较少,同时可以用插值实现较为平滑的效果,不需要骨骼动画。
4/动画内部混合

混合树就是通过控制两个变量进行状态间的混合

Unity动画和动捕衔接的方法  第6张

5/代码生成动画


 动画曲线 = 动画曲线.线性(0.0F, 1.0F, 2.0F, 0.0F);
        动画剪辑剪辑 = 新的动画剪辑();
clip.legacy = true;
夹。SetCurve(“”, typeof(Transform), “localPosition.x”, curve);
动漫。AddClip(clip, “test”);
动漫。播放(“测试”);

6/其他动画


简单动画,如规则的移动旋转等,可直接用iTween,DotTween等插件
Unity动画和动捕衔接的方法  第7张DotTwee类图
从上图中可以知道主要实现如何获取到每帧的值,进而实现联动的效果。

  03.结合

实现旧动画,新动画,代码生成动画,DotTween动画和动捕的结合,需要找到一个共有的切入点来统一每帧的参数和之前的参数。
如何实现结合动画和动捕直接需要可以获取的关节参数的地方
1/动画系统的流程

 Unity动画和动捕衔接的方法  第8张


2/动捕的流程

 Unity动画和动捕衔接的方法  第9张


3/衔接处理

Unity动画和动捕衔接的方法  第10张


4/数据融合

可以采用中间添加倾斜动画解决。
这里采用滤波来解决渐变的规程。
由于动捕和动画衔接位置不一致可以采用kalman来进行上下帧的衔接
 
动画衔接动捕过程:

1,在动画的情况

 Unity动画和动捕衔接的方法  第11张

2,切换到动捕
Unity动画和动捕衔接的方法  第12张
3,代码过程
Vector3 localEulerAngles = root.localEulerAngles;//获取当前关节的角度
nodes[0].set(x, y, z, iskalman);对角度就行卡拉曼
root.localEulerAngles = nodes[0]。V;重新对卡拉曼之后的值进行赋值

5/效果

添加前效果,没有渐变
Unity动画和动捕衔接的方法  第13张

添加后效果

Unity动画和动捕衔接的方法  第14张

  04.总结

实现动画和动捕的结合,由于动画和动捕都是需要计算好值,然后进行赋值。因此可以对计算好的值进行重新融合计算值,然后进行赋值。再进行界面绘制。
Unity动画和动捕衔接的方法  第15张


「作者简介」


弗特(王兴)


雷火资深前端


致力于移动端的性能提升与用户体验


曾负责移动端的工程,目前负责虚拟偶像方面的开发,提升显示效果。



Unity动画和动捕衔接的方法  第16张

关注 分享 在看就是所长最大的生产力!

The End