[动画] 论IK RIG之引擎应用

查看:18568 |回复:2 | 2022-7-3 09:53:40

您需要 登录 才可以下载或查看,没有账号?注册

x

最近有一位技术动画小伙伴CarlosDong董锦超向我们发来投稿!我满怀期待的看了他的投稿内容,不由得感叹一句!大家的知识面太广泛了,真的好有才华
4321d2061a76dc01902f8a0c26b6194e.gif
投稿的内容是关于IK Rig,本来对于这方面的内容我也就是略知道一点点皮毛,但是经过这次小伙伴的详细介绍和应用,让我真的大开眼界!顿时觉得自己又多学了一项技能!这么好的知识,咱们是不可以独享滴!通通给我分享起来!(以下为投稿内容)

简单认知IK Rig




IK RIG解决的问题便是,让不同骨骼(层级,数量,体型)绑定间能通用动画,从而达到传统骨骼重定向不能实现的动画通用性。
GDC这段关于Ik rig的演示不再赘述,本文只演示其在实际开发的作用以及与前文的骨骼绑定流程的接口。
https://www.youtube.com/watch?v=KLjTU0yKS00
事实上,UE5已经能够支持IK RIG, 引擎内的任意 retargeting 复用动画资产 已成为现实。但,本章着重探讨IK RIG 在绑定前期的应用价值。那么有没有办法在DCC中就打通IK关节,从而实现任意角色,任意骨骼的动画重定向呢?

f070329a6b0dd41286e243682e196b31.png
IK RIG 在前期环节发挥的最大作用是统一不同骨骼层级数量的RIG。笔者在开源空间有幸找到相关插件的maya源码。至此IKRIG 实现了骨骼重定向中根据相对位置递归,而非根据骨骼位移/旋转递归,通过调整匹配中介IK RIG, 输入与输出的参数使得不同骨骼层级的绑定能重复完全相同的动作。但是,其匹配算法的核心还是在于深度学习。才能让其pose编码更准确。




与Human Ik的异同



提到DCC的IK 控制器,传统通用的其实是Human IK系统。Human Ik其实可以实现对于基础人性骨骼的锚定式动画匹配(Match Source), 面向目标的动作匹配(Action Space Comp:User), 动作补偿(用于弥补错位)对于典型二足类人型角色,Human IK 可以通过指认重要关节控制器,实现11个IK 触点的控制。在迁移动画中,角色的体型适配做了如下定义:Ik T Blend (手臂的Ik 位置同步)   Action SpaceCompensation (动作空间弥补,用于匹配步距)   Ankel Height Compensation (同步脚高度)  FootSpacing (足间距) 匹配以上参数可获得更好的位移匹配效果。
直接迁移原始动画数据的问题:脚步穿模地面+滑步▲



Stride matching 避免滑步 + Mirror Animation 调整移动方向▲



FootSpacing 调整▲

对于一般性异构人形骨架的重定向Human Ik 完全能够满足需求。但是,对于异构骨架重定向,最大的痛点是打破传统人形结构,从而使游戏商业化皮肤中能对角色设计和骨骼建设做更多样化的尝试的同时能够通用基础动画。比如,经典美式卡通中常用的“橡皮管动画”(rubberhose animation)就需要在制作动画时对于骨骼进行夸张的软化形变。因此动画对于软性骨骼的适配也就显得尤为重要。
除此以外,在游戏流程中,项目会需要不增加资源量的情况下通用基础骨骼动画。



在动画历史上留下过深刻烙印的rubberhose animation 形式:代表作《Skeleton Dance》▲

多关节腿部角色:机甲类角色外装▲


IK Rig 工作原理详解




图源知乎@姬宏江*Animation Skeleton*从 Skeleton 计算出的 IK RIG*从 IK RIG 映射到新 Skeleton 的 IK RIG*从新的 IK RIG 计算出新的 Skeleton Animation*新的模型动画第一步:移动控制归一化(normalize),  并记录rest pose第二步:记录来源骨骼长度,方向,世界坐标矩阵第三步:Ik Rig Encoding (编码以上所有信息*86个)第四部:IK Rig Decoding (解码输出到目标Ik Rig)第五步:匹配目标骨骼,反向算出动画数据csv,输出新的骨骼动画或直接加载到引擎角色中。

IK Rig 组成结构与变体(此段引自知乎@姬宏江)




常规的人形 Skeleton 拆分成不同的大类COG / Pelvis / Hip (Skeleton 常用的 Root Joint,包含位移和旋转)Spine (脊椎部分,主要控制躯干的旋转)Head (脖子和头,控制头部旋转)Shoulder (肩膀,通常左右各一个 Joint 与 Spine 的末端相连,表达肩部的旋转)Arms and Legs (胳膊和腿,四个 2 Bone IK 控制旋转)Foot (脚踝和脚趾的旋转,常用的 IK 方式是局部逆 FK 控制腿部 2 Bone IK 的端点)
针对不同的类考虑使用怎样的 IK RIG 方式COG - FK ,控制人体跨部的旋转和整体的位移Spine - IK Chains,只保留 Root 和 Tip 的旋转,中间根据曲线插值Head - Look At IK,脖子和头可以控制旋转的权重Shoulder - Look At IK,可以做一个肩膀的朝向 IK,同时影响胳膊 IK 的 RootArms and Legs,2 Bone IKFoot ,Reverse FK,从 Toe - Ball - Feet 反转原有的 FK,影响腿部的 IK Tip
实现不同类型的 IK Rig定义 IK Rig 的数据结构:不同的尺寸,在本案例中有86个从原有的 Animation 和 Skeleton 计算出 IK Rig 的参数映射到新骨骼的 IK Rig 参数通过 IK Rig 计算出 Joints 的 Transform

Maya IK Rig 具体操作解析




*Reference Rig获取到原始骨骼的矩阵信息。(基本信息如左下图,可以手动获取也可以脚本获取), pole vector,    position,orientation, length等信息
*将骨骼信息获取到encoder归一化
*Encoder 发送到decoder, 在Attribute里人工匹配输出绑定的尺寸


*在此过程中,IK RIG encoder 会记录原始骨骼过来的所有归一化数据。例如:effector  根据其IK链长度归一化,其他locator位置都是相对于Hip 位置的归一化。因此,加载到不同骨骼的同样动画,其数值都是相同的。
*对于Normalize Global Xfo, 点选可匹配位移,减少滑步。
* IK Rig Locator 中记录了effector 信息,pole vector, 长度。把自己建的骨骼父子约束到相应位置的locator即可。


左侧为输出骨骼▲

*针对UE, CSV文件可以对归一化的IK数据存储,输出86个数组的float. 这些数据通过蓝图(有python插件)返回给相应输出rig上,校准其对应的高度位置(如Hip Height, Length 等)

CSV记录▲

CSV动画文件到decode rig▲



CSV驱动decode骨骼▲

*引擎内每帧Tick, 根据CSV解码每帧对应的IK POSE, 并输出必要的IK 朝向信息
* 适配角色尺寸(手调),并根据IK 信息驱动引擎内的IK动画系统。


Get Pose▲



Set Limb Orientation▲

Ik Rig Base Setup: 用拿到的数据驱动躯干的FABRIK 以及肢体的2BONEIK▲

最终,从CMU动捕库获取的自定义骨骼动画数据就被IK RIG成功重定向到了UE的小白人骨骼上。最终效果

方案总结:
优势:局外IK Rig将UE5的IK RIG原生功能带到了MAYA(DCC)+ UE4(或其他引擎) 环节。能够让同一段动画在差异化的绑定骨骼上流通,并输出引擎,不增加资源量。
劣势:目前手动定义的环节比较多,自动性有待提升。另外IK RIG普遍问题还在于性能消耗,依附于引擎IK结构每帧Tick,让局内大范围实现受到限制 。

看完之后有没有觉得自己都变得博学了!后续有小伙伴想和大家分享一些关于CG的知识和趣事也可以投稿分享哦!好东西当然要大家一起学才有意思!
end
公众号地址:https://mp.weixin.qq.com/s/kZm0d2YGzE6hU35sCAuzaA
2022-7-3 09:53:40  
 赞 赞 1

使用道具 登录

2个回答,把该问题分享到群,邀请大神一起回答。
2#
感谢楼主分享!
回复 收起回复
2025-1-15 01:19:56   回复
 赞 赞 1

使用道具 登录

3#
回复 收起回复
2025-3-26 11:27:13   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

CG世界
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表