前言

  很多年前,Maya 就有了 HumanIK 插件用于对接 MotionBuilder 动捕。
  不过目前我还没有对接过动捕相关的东西,所以 MotionBuilder 对接这方面还不懂。
  那么 HumanIK 有什么特点呢? 相较于传统的绑定有什么区别

HumanIK的特点? - 知乎
https://www.zhihu.com/question/264587401

  知乎上的回答很不错,HumanIK 的缺点就是功能过于单一,只能匹配类人二足动物的效果。
  不过它在这个单一领域上是极其强大的,出了回答中提到的 IKFK无需转换之外,还有极其强大的动画重定向功能。

  关于 HumanIK 的一些基础使用方法可以参考网上的一些中文教程 在Maya2019中使用HumanIK对人型角色进行绑定设置并制作动画
  HumanIK 是一款很棒的绑定插件,但是不仅仅可以做绑定,HumanIK的骨架定义赋予了它更为强大的功能,动画重定向。(专门用来对接动捕的)

  最近工作上遇到了非常坑爹的问题,需要活用 HumanIK 重定向来解决问题。
  由于制作上赶时间,我们使用的绑定文件是一套临时的影视流程绑定,虽然我提供了将影视绑定转为游戏骨骼进引擎的方案,毕竟是临时的。
  后面新的绑定到了之后,我们需要将旧的绑定动画还原到新的绑定上,这个时候 HumanIK 就可以发挥它的巨大作用。
  本篇就来重点讲解一下 HumanIK 重定向的使用 , 以及一些 Python 处理方法。

HumanIK 重定向

  重定向的教程可以参考 3DMotive Intro to Human IK in Maya
  下面我也来简单讲解一下使用流程。

alt

  HumanIK的图标在 Maya 右上角,点击可以开启。
  然后点击 Create Character Definition 来创建角色。
  这里可以将已有的一些绑定系统的骨骼添加到定义中,最后角色的定义化之后就可以通过 HumanIK 进行重定向。

alt

  HumanIK 添加定义有两种方式,一种是选择骨骼然后再 UI 上右键选择 Assign Selected Bone

alt

  另一个方式就是双击 UI 然后选择骨骼。

alt
alt

  HumanIK自带了一套基础的镜像选择骨骼的规则,如果绑定系统的规则不太一样可以手动添加新的匹配规则。

  下面我以 ADV 绑定系统为例,实现角色化。

alt

  如果当前角色不是 T-pose ,那么 HumanIK 会有警告,建议手动将角色调整为 T-pose 进行匹配。

alt


alt

  重定向操作可以导入 HumanIK 的参考动画进行重定向。

alt

  HumanIK 上索引动画文件
  结果并没有教程中的那么顺利,可以看到 ADV 蒙皮全乱了。
  主要原因是 ADV 的骨骼被绑定系统所约束或连接控制了。
  解决这个问题有两个方案。

方案一 打断控制

alt

  可以通过打断所有的连接来正确匹配。
  当然这样虽然匹配到一起,但是由于打断了控制器,因此后面处理需要将骨骼重新约束到新不绑定的控制器上,操作会比较麻烦。

方案二 利用 Custom Rig 匹配控制器

alt

  HumanIK 提供了自定义控制器的匹配机制,点击最后一个按钮,可以将控制器添加到匹配的UI中

alt

  后续就是将 ADV 的控制器添加到控制器定义中,这里我使用 IK 系统进行匹配。

alt

  添加完控制器如上图。

alt

  如果直接将极向量控制器添加到 HumanIK 进行匹配,匹配效果并不理想。
  后面我用 Locator 来约束极向量控制器,然后将 locator 添加到 HumanIK 的匹配关系中,效果就好了很多。

alt

  注:角色的权重只是大概刷了下,权重问题可以忽略。

alt

  最后通过 HumanIK 的面板 bake 关键帧即可。

方案比较

  方案一的匹配比较好,但是多了一步反向约束FK的操作,比较麻烦。
  方案二虽然差不多一步到位了,但是有时候控制器的匹配效果不好,反而不如方案一的骨骼匹配准确。
  而且方案的自定义控制器无法匹配手指,还是欠缺了不少。

HumanIK Python 自动重定向探讨

原理分析

  由于工作上遇到的绑定就是无法使用 方案一 的,使用方案一即便 T-pose 已经对上了,但是控制器匹配就差了10万8千里。
  所以我后面就放弃了方案二了。
  下面需要实现的是如何批量将上面看到的操作自动化,毕竟动画如果很多的话,人工处理还是太费时间了。
  角色定义化其实还好,在绑定文件做好,动画文件引用是没有问题的。
  最大的问题在于 HumanIK 的匹配选择。

  通过查底层的 Mel 代码可以找到 HumanIK 切换的时候执行的命令。

1
2
3
4
5
// 这里默认选择第二个选项,也可以遍历 optionMenuGrp 的 item 来获取特定的序号
optionMenuGrp -e -select 2 hikCharacterList;
hikUpdateCurrentCharacterFromUI(); hikUpdateContextualUI();
optionMenuGrp -e -select 2 hikSourceList;
hikUpdateCurrentSourceFromUI(); hikUpdateContextualUI();

  这个背后就是操作 HumanIK UI 的操作
  我一开始开发因为赶时间,没有去深究 hikUpdateCurrentSourceFromUI 函数里面的命令操作。
  反而给我带来了很多麻烦,因为 UI 更新是异步的,我需要等UI更新了才可以获取到 source 的选项。
  因此我需要活用 evalDeferred 命令来解决异步操作之后的同步问题。

  具体的操作方法可以参考我写的临时脚本 github
  利用 evalDeferred 的 lowestPriority 属性可以实现优先级错开执行的效果。

  后来我进一步研究发现 HumanIK 可以用 hikSetCharacterInput 命令来加载两个 HIKCharacterNode 实现匹配功能。
  这样就不需要等待 UI 的更新了。

自动化工具

github

  参照 github 仓库的说明。
  可以批量重定向多个动画文件。
  重定向之后输出包含两个不同绑定的文件,需要在 HumanIK 的面板属性上细调来完善匹配效果。
  匹配好了之后导出 FBX ,通过 FBX 的骨骼来约束 FK 控制器,然后再 Bake 一遍关键帧即可。

  后续的操作因为FBX导出的流程可能都不大相同,所以没有给自动化操作。

总结

  这次 HumanIK 自动重定向 在工作上其实并没有发挥太大的作用,因为时间实在是太赶了。
  重定向的效果也不是特别直接理想,所以动画师是直接替换引用再调整的。
  我是后面抽时间再将整个操作流程和工具整理了一遍,顺便学习了一下 pymel 的一下用法。