Mesh Transform动画的高效实现
本文介绍一种Transform动画的实现方式,通过创建虚拟关节的方式,以蒙皮动画的方式实现Transform动画,此方式应用于快手必扬特效平台的FBX导出系统中。关键帧动画主要有顶点动画、蒙皮动画、Transform动画三种,不雅察看到蒙皮动画与Transform动画的数据类型有大量的相似之处,本文通过创建虚拟的关节,对Mesh进行蒙皮绑定,转移动画至关节上,从而将Transform动画转换为蒙皮动画。01 布景介绍
1.1 必扬特效开放平台
必扬特效平台处事于快手及快手旗下的拍摄类产物矩阵,兼具专业性、缔造性、与商业性的特点,能够同时为C端和B端带来持续性的创意化撑持。以行业领先的技术沉淀,为用户提供多种撑持与场景拓展。并提供创作东西Beyond Effects,旨在向创作者提供美颜、美型、美妆、滤镜、画面细调、素材配置、画面特效等技术,创作者可以使用东西制作本身的特效,并在快手应用上发布,吸引上亿用户使用。通过必扬特效平台,可以给用户成立更深层次的情感表达,品牌可以以更有意义的方式与客户成立联系。“激发创意,缔造风行”是平台的使命。
1.2 关键帧动画
关键帧动画是指一种只包含物体关键动作数据 ,其余部门由插值得到的动画。帧动画往往大量运用于游戏、影视、特效中,使此中的角色富有朝气。必扬特效平台现已撑持三种关键帧动画:蒙皮动画(图1)、Transform动画(图2)、Morph动画(图3)。
图1 蒙皮动画
图2 Transform动画
图3 Morph动画
在撑持蒙皮动画与Transform动画的过程中,我们发现两者的数据有大量的相似之处,因此,我们在导出Transform动画时,采用蒙皮动画的格式来生成Transform动画的数据。
1.3 FBX
FBX(.fbx)文件是用于记录3D几何和动画数据的格式,可以使用分歧的法式打开,编纂和导出高保真3D文件。本文主要操作对象为含有Transform动画的FBX对象。
02 实现法式
本文的主要措置方针是不受骨骼影响的Mesh(Static Mesh)的Transform动画,即直接感化于Mesh本身的Transform的一系列变换。由于分歧的引擎的设计理念和底层架构有较大差异,对于StaticMesh的Transform动画,分歧引擎的实现方案差距也较大。
我们按照快手自研衬着引擎的设计理念和底层架构,调研了Unity、Unreal Engine等引擎的措置方案,最终采用了和Unreal Engine相似的实现方式:将Static Mesh转换成Dynamic Mesh,从而将相应的Transform动画转换成蒙皮动画。
本方式主要有三个法式:
[*]导出Mesh数据:从FBX中读取Mesh的数据,生成动画的操作对象。
[*]创建关节并进行姿势绑定:通过给Static Mesh进行绑定蒙皮,将Static Mesh对象转换为Dynamic Mesh对象。
[*]生成蒙皮动画数据:通过Transform动画数据和创建的虚拟关节,生成对应的蒙皮动画数据。
2.1 导出Mesh数据
通过遍历FBX的整个场景我们可以获取当前需要导出的Mesh的节点,有了这个节点,我们可以获取到Mesh的Transform、控制点位置、光滑组、UV等信息,用这些信息我们可以在引擎中构建出一个Mesh对象。
2.2 创建关节并进行姿势绑定
首先我们创建一个虚拟的关节,并给它一个并世无双的索引和名字,并将它的父关节的索引设置为-1,暗示它为一个根关节,关于关节的树布局我们将在后续再进行讨论。之后,获取当前节点的Global Transform和父节点的Global Transform,以AUTODESK FBX SDK为例,使用EvaluateGlobalTransform函数可以直接获取当前节点的Global Transform。按照下式:
可以计算出该节点到父节点的变换矩阵。我们将该变换矩阵作为关节姿势,遍历mesh的所有顶点使其只受到我们刚才创建的关节的影响,权重设为1,这样,我们就给mesh创建了一个影响权重为1的关节,而且进行了姿势绑定。
2.3 生成蒙皮动画数据
为了构造蒙皮动画,我们需要先拿到Tranform动画的数据。FBX中的动画数据布局如下所示:
我们找到当前Mesh的Tranform动画对应的AnimationLayer,之后通过AnimationLayer和Mesh的Node节点可以得到对应的Tranform动画数据,如下所示:
struct AnmationKey//一个关键帧中保留的数据
{
float time;//动画时间,这里用的是实际时间
float value;//当前数据对应的值,例如缩放的X分量
float leftTangent = 0.0f;//曲线的左切线点,用于控制前一帧和当前帧的变化趋势
float rightTangent = 0.0f;//曲线的右切线点,用于控制当前帧和后一帧的变化趋势
InterpolationType type;//插值类型
TangentMode tangentMode;//切线的变换方式,如:样条线、线性、钳制等。和切线点一起控制帧之前曲线的变换趋势
};通过不雅察看发现,Tranform动画数据和蒙皮动画的数据基本完全一致,区别在于Tranform动画的对象为Mesh,而蒙皮动画的对象为关节,因此,只需要采用不异的数据,对上一步创建的关节生成动画即可,因为分歧的引擎的数据布局有较大差异,所以具体生成方式应该按照引擎具体的数据布局确定。在快手自研3d引擎中,只需要将Tranform动画数据中对象的名字,改削为上一步中创建的虚拟关节的名字,则该动画数据可以直接用于驱动引擎中的蒙皮动画。
03 效果展示
图4为maya中的动画效果,图5为必扬特效平台中的动画效果,可以看出必扬特效平台基本完全地复现了设计师在maya中制作的动画效果。
图4 maya动画效果
图5 必扬特效平台动画效果
04 细节讨论
4.1 动画的层阶布局
创建虚拟关节的时候,我们只是简单的把当前Mesh的关节置为根节点(父关节索引为-1),所以最终得到的动画只计算了本身的变换,并没有将父节点可能存在的动画进行叠加计算。
图6 层阶布局
如图六所示,球体有向右移动的动画,立方体有向下移动的动画,由于立方体是球体的子节点,立方体的最终动画效果应该为向右下移动。因此在创成立方体的虚拟关节时,需要将它的父关节索引设置为球体的虚拟关节索引,这样在最终计算动画时,我们立方体的“蒙皮动画”才能具有向右移动的动画。
4.2 顶点数据措置
我们在设定虚拟关节的姿势时,采用了当前Mesh节点到父节点的变换矩阵作为姿势矩阵,因此,在存储Mesh控制点的位置信息时,只需要存储控制点相对于Mesh空间的部门即可。然而部门引擎最终存储的Mesh顶点的位置信息是相对于世界空间或者模型空间的,这样导致转换后的Transform动画在计算顶点最终位置时,会呈现预期外的偏移。
图7和图8分袂展示了在一个动物手掌动弹的动画中,未措置偏移和措置偏移的情况。可以明显看出,相较于图8,图7中“掌心”与“掌”两个Mesh之间呈现较大的“间隙”,这个“间隙”就是我们所说的预期外的偏移。
图7 未措置偏移
图8 措置偏移
因此在导出Mesh数据的时候,需要查抄顶点的位置信息是否是相对Mesh空间的,如果不是,则需要转换至Mesh空间中。
05 总结与展望
本文提到的Transform动画的实现方式,属于必扬特效平台FBX导出系统的一个子功能。我们通过此方式,使引擎可以通过一个动画系统展现多种动画,减少了引擎的开发工作,而且通过改削虚拟关节的数据,可以实现多种效果,如模型镜像,更多效果可以参照Unreal Engine中的虚拟骨骼部门。未来我们将继续开发更多的3d功能,并上线到必扬特效平台减少泛博特效师用户的创作成本。(本文初度发布时间为2022-03-18)
参考:
https://effect.kuaishou.com/#/faq/content/effect_info Burtnyk N, Wein M. Computer-generated key-frame animation. Journal of the SMPTE, 1971, 80(3): 149-153. https://lensstudio.snapchat.com/guides/3d/3d-animation/ https://www.autodesk.com/products/fbx/overview Gregory J. Game engine architecture. AK Peters/CRC Press, 2018. Joshi P ,Meyer M ,Derose T , et al. Harmonic coordinates for character articulation. ACM Transactions on Graphics, 2007.
快手Y-tech介绍(公众号同名)
Y-tech团队是快手公司在人工智能范围的探索者和先行者,致力于计算机视觉、计算机图形学、机器学习、AR/VR等范围的技术创新和业务落地,不竭探索新技术与新用户体验的最佳结合点。Y-tech在北京、深圳、杭州、Seattle、Palo Alto有研发团队,成员来自于国际知名高校和公司。
持久招聘(全职和实习生):计算机视觉、计算机图形学、多模态技术、机器学习、AI工程架构、美颜技术、特效技术、性能优化、平台开发、东西开发、技术美术、产物经理等标的目的的优秀人才。如果你对我们做的事情感兴趣,欢迎联系并插手我们,一起做酷炫的东西,缔造更大的价值。
联系方式:y-techservice@kuaishou.com
页:
[1]