UE4实现交互式动作捕捉
在传统的动作捕捉流程中,要想在引擎中查看最终效果,需要先在动捕软件中将录制好动捕数据导入到max,maya,motionbuilder等资源生产工具中,调整动画效果,重定向角色骨骼(也可以先重定向再动捕),然后将动画导出为FBX格式,这样才能导入引擎查看。过程繁琐,无法直观的看到角色动捕数据在游戏中的效果。
随着UE4livelink插件的推出,这项工作流有了极大的改善。通过livelink功能,可以将外部的动捕数据直接流送到引擎中,从而实时查看动捕效果,或者直接用作虚拟形象的直播。并且可以通过引擎内置的序列录制器,将实时动捕数据录制为能被引擎直接使用的动画资源,方便后续使用。无需经过繁琐的导入导出流程,极大的提高了工作效率。
不过因为livelink主要功能是数据传输,所以大部分情况下只能用于动画预览,直接录制出来的动画资源并不是太符合引擎使用规范。如果想通过引擎直接录制动画,或者通过动捕实现一些简单的实时交互功能,那么就需要对livelink传进来的动画数据做一点点修改。
缺少root点的位移信息是问题的核心所在。动捕软件传进来的数据一般是通过盆骨骨骼(hip)记录演员的旋转和位移的。骨骼与动捕服上的标记点对应。在动捕数据的录制过程中,用于标记动画角色在虚拟空间的位置信息的root骨骼并不会移动,因为现实中没有这个数据。
无论是想记录动画正确的位移信息,还是挂载charactermovement或者camera等组件实现一些基本的交互操作功能,都需要保证角色的root点能够正确的获取到传进来的旋转和位移数据,从而驱动角色骨骼动画和动捕效果的一致。而在某些特殊情况下,比如动捕场景是平地,但是虚拟场景是斜面,还需要通过角色的胶囊体碰撞来修正角色位置。换而言之,也就是要实现一个简易的rootmotion功能。
直接输入动捕数据的效果,可以看到root骨骼并不会发生位移,并且因为没有正确的碰撞信息,角色直接穿进了墙里。
作为不懂程序的美术,让我写代码实现这个功能是不现实的。所以全部效果都用蓝图连连看实现。
UE4中角色控制器的层次关系依次胶囊体——root骨骼——hip盆骨,所以直接将盆骨的数据用于胶囊体或者root骨骼是不行的,这样相当于用子物体驱动父物体,而父物体的运动又会带动子物体,会无穷的代际下去,导致角色瞬间飞掉。必须先拿到hip的位移和旋转值,然分别赋予胶囊体和root骨骼。因为盆骨的高度不等于角色着地高度,所以同时还要计算新的root点的位置,保证和胶囊体位置一致。
所以基本逻辑就是获取hip的旋转位移,赋予胶囊体,再减去hip到root骨骼的距离,以保证角色始终和胶囊体相对位置一致。
蓝图如下
最后效果,可以看到角色位置和胶囊体始终一致,由于碰撞的作用,角色不会再穿墙进墙里面去,而是实时的被环境阻挡。并且由动捕数据驱动的角色可以和虚拟环境里的道具产生交互。
然后所有的运动都可以用序列录制器录制下来导出为动画。
所以基于引擎稍做改动,就是一个很好用的动捕软件,或者直接做成一个交互式的游戏。