BlueRose
文章97
标签28
分类7
外包过程中的动画重定向以及蒙皮调整经验

外包过程中的动画重定向以及蒙皮调整经验

前言

本人最近给自己的Demo外包了若干角色动画,也遇到了一些坑。所以这里给大家分享一下相关经验,避免大家再次采坑,尤其是那些缺乏经验、精力的独立游戏制作者。当然本人对3DMax完全不熟悉,大部分信息都是本人与外包大哥沟通过程中产生的个人认知,如有错误还请指正,谢谢。

PS.本人因为布料碰撞问题导致重新导入6次角色,包括绘制布料、设置碰撞与编写动画蓝图。真是太痛苦了!

如果角色需要使用Ue4的布料需要额外确认的事情

  1. 使用的是否是3DMax。
  2. 场景单位问题:角色大小是否正常。
  3. 骨骼问题:根骨骼的缩放是否为1、旋转是否为0(与布料碰撞有关),骨盆骨骼也需要检查一下,防止因为fbx导出轴向问题导致骨盆骨骼旋转。换句话说就是在拿到绑定后的角色时,需要马上使用Ue4进行角色布料碰撞测试。

当然蒙皮与动画肯定是要检查的,一般靠谱的外包都不会犯这些错,所以这里我也不说了(主要是我也不太懂)。这里主要是我个人认为需要注意的问题:

第一点和第二点可以合起来说:因为3DMax的默认单位是英寸,在绑定时有可能会出现因为导入模型时的单位不正确而导致角色缩小问题。至少本人遇到了这个问题,整整郁闷了1个月。个人认为关键还是需要搞清楚max或者fbx文件的单位、max的系统单位以及输出单位。调整单位的方法有以下3个:

单位问题

设置Max场景单位

Max导出文件单位不正确的主要原因在于文件本身的单位不正确。Ue4的默认单位为厘米,而Max默认为英寸。所以我们可以通过调整单位来解决这个问题,大致步骤如下:

  1. Cutomize-UnitsSetup,进度单位设置命令。
  2. 选择SystemUnitSetup。
  3. 将单位设置为厘米。
  4. 此时打开单位为英寸的max文件就会提示Units Mismatch,选择Rescale The File Objects To System Unit Scale。
  5. 之后导出Fbx注意将导出单位改成厘米。

场景缩放

对于蒙皮文件,这个操作可能会产生问题。操作步骤如下:

  1. 在Utilities栏中找到RescaleWorldUnits,并打开。
  2. 设置缩放因子后,点击确定。

UnrealEngine导入设置

在Ue4导入选项中有个单位缩放,你可以直接在这里设置导入缩放比例。在没有Max源文件,只有fbx文件的情况下只能选择这种方法。

注意:如果你的角色要使用布料系统,那么以上方法都会让布料的碰撞失效。经过试验,如果根骨骼的缩放不为1以及旋转不为0,就会出现碰撞失效的情况。因为这些方法本质就是缩放根骨骼。

一种简单的解决方法就是直接设置角色类骨骼模型的缩放。不过本人因为强迫症所以不推荐这种方法。具体的解决方法请参照Maya蒙皮传递这一节。这里我先说一下2个软件的骨骼系统,之后再细说解决方法。

骨骼类型

据我所知3DMax有CS(biped)与CAT骨骼系统,虽然它也有普通的骨骼,但是因为角色动画库基本都是以这些骨骼系统为基础所以基本不会使用。

我找的外包大哥用的是CS(biped)。CS有点不爽的地方就是会都出一个Biped节点。

至于CAT,结构和Ue4的HumanIK结构相似,但外包大哥说这个不太稳定,所以没有使用。

对应到Maya则是HumanIK工具,结构和Ue4的HumanIK结构相似(多出一节脚趾骨),当然我目前没有和专门外包Maya动画的公司沟通过,不太确定他们是不是使用HumanIK来做角色动画库的。如果公司打算专门给Ue4做动画,可以考虑使用Ue4的动画插件。

这些骨骼系统对于动画其实并没有影响,但如果你是一个和我一样的拿着自己的工资做Demo的傻逼个人开发者,因为资金有限无法外包所有的动画或是需要使用商场资源制作原型,亦或是想套用AdvancedLocomotionSystemV的动画系统。那么我推荐你使用Ue4的标准骨骼进行绑定,并使用重定向系统将其他骨骼系统的动画重定向到标准骨骼上

理论上动画师还是会使用动画库对应的骨骼系统再绑定一个角色,因为动画需要根据角色模型进行调整。当然绑定的精度不用那么高了。

动画重定向

因为本人使用的是Maya,所以这里以Maya为主。首先需要制作用于重定向的标准的TPose,就是把角色摆成一个十字架,可以参考HumanIK工具的标准骨骼。其原因是因为TPose容易统一,方便对齐。重定向Pose将会直接影响重定向的质量。所以我推荐在Maya中制作,另一个原因在于Ue4的重定向工具无法根据现有骨骼动画处理IK骨骼动画。下面我将简单介绍Ue4与Maya中的重定向流程:

UE4:在Maya中制作完TPose后给骨骼K一帧动画并导出。在Ue4中导入后,在得到的AnimationSequence上右键Create-Create PoseAsset,之后就可以在RetargetManager左下的ManageRetargetBasePose界面中点击ModifyPose,指定创建的TPose。

根据重定向源与目标不同还可以分为(这里的非UE4骨骼动画以CS骨骼动画为准):

CS=》Mannequin与Mannequin=》CS:按照对应骨骼结构,在RetargetManager的SetUpRig中选择HumanIK模板并设置对应骨骼即可。如果两个绑定角色的身高相同,root骨骼可以置空。如果不同则需要在给CS骨骼再添加一根root骨骼。重定向过程中,可能会出现手臂、腿部不正确的问题,这可能是twist骨骼位移的问题,需要将部分twist骨骼需要置空。

CS=》CS:这种情况可能涉及到其他非标准骨骼,所以这里需要在重定向源骨骼Asset上右键Create-Create Rig,再按照对应骨骼结构填入。

Maya:选择Rigging模式,点击Skeleton-HumanIK运行。之后再点击CreateCharacterDefinition(创建角色定义)就可以指定对应骨骼了。

你可以手动指定,也可以套用官方模板(前提是你的骨骼没有改过名称),模板有CS、CAT与HIK。大致步骤如下:

https://www.youtube.com/watch?v=ms1wGBjykA8

如果你的骨骼改过名称了,就需要手动指定了。如果你的角色骨骼没有处于TPose状态,HumanIK界面中的大臂与手会显示为黄色,所以遇到这种情况就需要调整当前骨骼为TPose状态。

在设置完重定向源与目标角色后:

  1. 点击CreateControlRig添加控制,之后角色会被锁住,如果要再次修改,则需点击边上的锁按钮。
  2. 导入重定向源的动画。
  3. 在HumanIK的Character中选择目标角色,Source选择为重定向源角色,此时重定向源的动画数据就已经重定向目标角色上了。
  4. 如果你的目标角色为UE4标准骨骼,此时就需要将IK骨骼P(设置父子关系)到对应的控制器上。
  5. 选中骨骼、模型与控制器,并且导出动画。(记住需要点击烘焙动画选项)

骨骼世界坐标

vector $joint=xform -q -ws -t joint1;
xform -ws -t ($joint.x) ($joint.y) ($joint.z) ;

设置坐标

When you set the attribute using pymels attribute objects (syntaxt like mynode.rotate.set() you’re poking numbers directly into the attributes; but the numbers are just numbers, getting interpreteed downstream as if you had typed them into the channel box.

You can use Pymel’s versions of the xform, move and rotate commands to set absolute values. These commands work the same way as the ones in the regular Maya docs. This. for example, will rotate Joint2 to 0,0,10 in world space, regardless of what it’s parent is doing:

import pymel.core as pm
example = pm.PyNode('joint2')
pm.rotate(example, [0,0,10], a=True, ws=True) 
The a flag is 'absolute' and the ws is 'worldspace' (docs here for rotate). move and xform have options for absolute and worldspace values as well. So to position a joint in worldspace it'd be

 pm.move(example, [1,2,3], a=True, ws=True)
xform is a bit more complicated and has more options but does the same things as well as allowing you to set pivots.

Maya蒙皮传递

大致操作如下:

  1. 复制原有蒙皮文件作为新的蒙皮文件。在删除历史、断开连接后,调整骨骼与模型大小,并且冻结缩放与旋转属性。
  2. 将原有蒙皮文件的骨骼进行批量重命名。
  3. 将原有蒙皮文件导入新的蒙皮文件中。因为之后需要将模型合并,所以需要确定UV通道是否正确(如果你像我那样扣了UE4角色的眼睛的话)
  4. 将原有模型与调整过大小的模型分别进行合并,之后切换到Rigging模型,运行skin-BakeDeformationToSkinWeights。
  5. 在大纲视图中选中对应项,按住鼠标中键拖拽到对应栏中以完成指定。指定完选项点击Apply。再等一把王者顺风局的时间,蒙皮的就传递好了。

Maya批量命名脚本

如果你的重定向源骨骼名称与目标相同,这就需要进行批量改名了。这是网上找来的脚本,对于骨骼需要按住Shift并且点击+,展开所有骨骼节点,再选中批量添加后缀。

from maya.cmds import *
sel = ls(sl=True)
numSel = len(sel)
for i in range(0,numSel,1):
  origName = sel[i]
  #print origName
  rename(origName,origName+'_old')

结语

本文写的比较仓促,如有不明白的地方欢迎交流。