Animation Retargeting 动画重定向
🌝

Animation Retargeting 动画重定向

Share Animation Among Characters

notion image
  • Allow animations to be reused between characters (save animator's work)
  • Adapt motion captured animations to different characters (reduce the cost)
做动画系统的时候,我们当然希望对于每一个角色,动画师都给我们做很多很多动画,但实际上动画师做不到。特别是现在越来越多的依赖于 motion capture 动捕设备的时候,我们不可能为不同的高低胖瘦的这个角色都会重新录一套完整的动画。
Animation Retargeting 就是让一个角色的动画能应用到另外一个身材比例不一样的动画上面。 Retargeting 要解决的核心问题就是采集一套动画可以应用在各种各样的角色上面。

Terminology

那这里面首先我们定义它的这个就是一个名词,学 terminalage 就是说大家现在知道就是这个这个以后你们出镜你跟人家讲说我学过这个游戏引擎的话就可以讲这些很专业的词汇了。
notion image
Source Character
notion image
Target Character
notion image
  • 动画 Retargeting 原始的采集动画的角色叫 Source Character 原角色。
  • 要去 apply 动画到的另外一个角色叫 Target Character 目标角色。
  • 原角色上的一个原始的动画,比如说走跑跳,叫做 Source Animation
  • Apply 到目标角色上后看到那个动画叫 Target Animation

Ignore Offset Between Source and Target Joints

Source vs. Target at Retarget Pose
Source vs. Target at Retarget Pose
(Source skeleton in yellow)
(Source skeleton in yellow)
The Offset in Retarget Pose
The Offset in Retarget Pose
上面的例子中,女角色的身高、姿态都和大怪物长得不太一样。大怪物有点驼背,但个子很高,女角色站得比较直。那这里的动画怎么去表达呢?
骨骼是一根接一根的,骨骼之间还有位移。比如大怪物到脖子可能是两米多高,女角色可能只有 1 米 5 左右,我们就认为他们还是一一对应的,忽略他们所有的位移项。
当动画在动的时候,女角色点个头,就会把一开始是垂直的脖子骨骼往前掰 30 度。但大怪物可能有点驼背,一开始的脖子就向前倾了 15 度。那这个动画怎么去 apply 呢?
这个时候的动画,我们应该去 apply 它相对原始的 bounding pose 旋转的位移。
⚠️
这是个很小的细节,但这个细节非常的重要。否则本来是一个站在那驼着背的怪物,当去被 retargeting 一个站姿很笔直的女孩子的走路动画的时候,会发现在播放这个动画的时候,大怪物一下子就站直了。

Keep Orientation in Different Binding Pose

Target vs. Source at retarget pose
Target vs. Source at retarget pose
The target looks weird
The target looks weird
所以其实我们传递过去的是动画相对的旋转、放缩和相对的位移,相对的是它的 bonding pose。
我们在动画存储的时候,很多时候我们存的就是相对的旋转、scale 和位移,所以的话问题不大。但是如果我们实现中存的是 local space 绝对的旋转的话,这个地方要做个小小的变化。

Process Tracks

Handle animation tracks respectively
  • Rotation track comes from source animation
    • Keep joint orientation in animation
  • Translation track comes from target skeleton
    • Keep the proportion of target skeleton
  • Scale track comes from source animation
    • Keep the scale in animation
notion image
有了前面的相对的变换后,我们就可以把所有的旋转动画依次 apply 到对应的骨骼上去,这个角色就能动起来。
如果这个角色有 translation 平移动画,我们要把它所有波及到这个骨骼,把它的相对长度考虑进去,然后按等比例的去放缩。这个讲起来有点简单,实际上做起来有点复杂,待会会更详细地解释。
放缩也是一样的,放缩就是直接等比例放过去。
基本上这样能得到一个有点意思的一个角色的动画。这里面特别容易出问题的是这个角色的两只腿,因为每一个角色大腿小腿的比例、身高都不一样,如果强行的把动画放进去,会发现这个角色大概率双脚是浮空的。

Align Movement by Pelvis Height

The movement of the character
  • Usually controlled by displacement curve or motor system at runtime
    • Displacement Curve is extracted from the pelvis pose in animation
  • Needs to be scaled by the proportion of the pelvis
notion image
最简单的做法就是:通过这个角色的腰线连到地面,知道这个角色身高之后。播放这个位移动画的时候,播放完之后会把这个角色按照它的身高等比例算它的(垂直)位移
比如大怪物的腰线离地面是 1 米,但是女角色腰线离地面 0.8 米,那我们就会相应地把这个位移往上提一下,缓解一下角色的双脚离空的问题。
我们经常会把这个位移作为一个 offset 的曲线存在这个动画中。如果这个角色在走,那我们希望这个角色走的速度跟它腰线离地的高度成正比。假设这个大怪兽腰线离地是 1 米,女角色腰线离地高度是 0.8 米,那大怪兽播放同样的动画的时候,它的移动速度也要快一点点。否则会觉得两只脚在地上凭空滑步。

Lock Feet by IK after Retargeting

notion image
notion image
但是如果两个角色体型差得很多,这种问题也不能被解决。
像左图的第一行,最左边是 source skeleton,中间是 target skeleton,右边是 longer calf。当两个角色大腿关节长短不一的时候,如果播放蹲在地上的动画,会发现两个 target 一个是小腿太长直接钻地而出,一个小腿太短直接悬空了。因此这时候需要有一些 IK 把它的脚锁死在地上,这个时候看上去才自然。
很多时候 Retarketing 是采取离线的方法去做。比如说动画师做完了一个角色的动画的时候,其实可以用离线的软件,包括更高级的算法,把动画的 Retargeting 做得更加的自然和真实。

Retargeting with Different Skeleton Hierarchy

notion image
我们刚才讲的所有都有个隐含的假设:动画在不同角色之间传递中,它的骨骼拓扑结构都是一样的。但事实上做各种各样的角色,他们的骨骼可能会不一致。比如上图中的例子,左边的角色只有一根 Spine 脊椎骨骼,中间角色有三根骨骼,那它俩之间的动画能否互相传递呢?这里就不展开了,因为算法会有非常多。

Easy Solution

notion image
notion image
其实可以根据骨骼名字去找对应。我们会发现它们之间共同的骨骼很多,两个共同骨骼之间可以定义一种类似的关系。
NVIDIA Omniverse 这个系统,解决问题的思路很简单,就是把这两个名字相同骨骼之间的所有骨骼看成一个映射,都映射到 0 到 1。
比如 source 是四根骨骼,target 只有三根骨骼。根据每个骨骼相对之间的长度,可以归一化到 0 到 1 之间一个参数。比如第一根骨骼,看参数,它很可能在 source 骨骼第二根骨骼中间的一个点,那就在中间点找到位置。然后把骨骼插上去,接着继续处理第二根 target 骨骼。(看图吧,看文字费劲)
虽然每一根骨骼并不会严格地和 source 骨骼完全的一致,但是它大体上又呈现出了类似的形状。
这个算法非常的符合直觉,效果来讲也是不错的。
 
Retargeting Animation in Omniverse
Retargeting Animation in Omniverse
要做得这么好的话,可能不止这么一个简单算法,可能还需要有比如说 deep learning 的算法或者一些 human behaver 更 natural 的一些处理,让这些角色看上去更自然一点。

Unresolved Problems of Retargeting

notion image
  • Self mesh penetration
  • Self contact constrains (eg. the hands when clap)
  • The balance of the target character
不过 Retargeting 其实还是有很多挑战的,就跟前面讲的 IK 一样。如果真的想做的话,其实 Retargeting 也是一个非常热门的一个 research 领域。这里面有很多问题很难解决,比如说角色的自穿插问题。跟 IK 一样,因为所有的计算都是假设一个抽象的没有空间体积的骨骼。一个瘦瘦的女生的一个动作,去 apply 一个胖胖的角色上的时候,胖角色自身的手会就会可能穿过身体。
还有其实很多动作是有语义的,比如说鼓掌。鼓掌的时候,如果这两个角色的肩宽不一样,Retargeting 完之后,这个手就合不起来了。
还有更难的,就是 Retargeting 完之后,其实我比如走跑跳或者去尝试够一个东西的时候,身体是要追求一种平衡感的,其实还有一种符合动力学的自然感的东西。在做 retargeting 的时候,如何能保证这件事情?这也是现在一些比较 hot 的研究问题。
如果角色之间相差没有那么大的话,很多时候 Retargeting 的结果是可以接受的。
💡
这个技术是在游戏引擎里面比较难的东西,但是又非常有用。因为当我们去做一个大型游戏的时候,一定要有这样的一个技术,这样动画师才不会反复做大量的动画。

Morph Animation Retargeting

Different face sharing the same topology
Different face sharing the same topology
Different face sharing the same topology
Different face sharing the same topology
Retargeting 不止在骨骼动画上面,在前面讲到这个 Morph Target Animation 时,实际上也有 Retargeting 的问题。比如在做人脸的时候,我们一般会把人脸的拓扑全部一致化。在捏脸的时候,骨骼一变动,整个脸就都不一样了。我们的表情动画可能是基于一张标准脸做出来的,当这个脸发生变化的时候,我们也要保持其动画的一致。

Morph Animation Retargeting Problem

notion image
有些动作是有语义的,比如说眼睛闭上的动作。比如原来角色的 Morph Target Animation 可以使眼睛可以闭上,但当这个角色的眼睛做得大了一点点后,眼睛就闭不上了。因此我们会加入一些额外的约束点,使这些顶点一定重合到一起。上图中的情况,我们就会在上眼睑和下眼睑加一些约束点。这个做法这里不展开,其实也是比较简单,就是 apply 完动画之后,如果发现这些控制点没有重合,我们就强行地把这些点拉得重合起来。然后用一个简单的拉普拉斯算子,这个眼睛就能闭得起来。
💡
拉普拉斯算子可以理解成去模拟橡皮表面,拉几个点,其他的点就有弹性一样的被它拉上来了。