UMA 301视频教程备忘录

  1. 制作一个Base Model

    • 用Adobe Fuse生成一个光头T pose模型,导出上传到Mixamo,Mixamo会自动为这个模型绑定骨骼,还要生成一些脸部表情的Blend Shapes。
    • 导入Blender,删除一些多余的骨骼,可以看到有很多面部表情的Blend Shapes。
    • 还可以利用其他的工具来生成模型,比如Daz。

      UMA 301 - Part 1 Creating a Base Model

  2. 修正一些不对的地方

    • Fuse导入Blender的模型,normal map没有起作用,要调整一下的。
    • 模型的全局Scale不是1,Rotation也不都是0,需要apply scale & rotation,把他们烘培到mesh顶点上,让scale和rotation归一化。
    • 要在原有的以Hip为root的骨架上,在加两个骨骼Global->Position,这是UMA需要的骨架结构。

      UMA 301 - Part 2 Fixing Scale & Global Bones

  3. 添加一些调整用的骨骼来改变人物外形

    • 因为现有的骨骼,你在调整上级的scale的时候,所有的下级都会受到影响,这不是我们想要的,所以我们需要在调整的地方复制一个骨骼(没有下级)。
    • 然后把复制的骨骼作为原骨骼的子(本来他们应该是同一级的),并且把原骨骼的权重全部转移到复制的骨骼上(原骨骼不在影响任何顶点,所有的影响都到复制的骨骼上了)。
    • 以上步骤是针对现有的骨骼的,如果要新建一个调整骨骼(一般都是叶子节点了),那么先新建好骨骼,放在对应的层级下面,然后再刷顶点权重。

      UMA 301 - Part 3 Creating Adjustment Bones

  4. 创建BlendShape来改变人物外形

    • 每个BlendShape(morph target)都是原始mesh的一个copy,所以如果有很多blendshape的话,会占用很多内存的
    • 在Blender中新建一个ShapeKey,然后进入编辑模式,改变一些顶点,就可以创建一个新的BlendShape了。

      UMA 301 - Part 4 Creating Blendshapes

  1. 把用Fuse制作的Blender文件直接导入Unity中遇到的问题

    • 把带有BlendShape的文件导入Unity,通过BlendShape改变过的部位的法线会有问题,造成奇怪的光照效果。
    • 人物的脚骨骼也有问题,歪掉了,导致人物的脚变形了。
    • 上面的问题是在Unity中直接用Blender文件导致的,因为其实Unity在导入Blender文件的时候,用了Blender的默认FBX Exporter。
    • 所以我们就不能在Unity中直接用Blender文件,而是通过Blender的FBX Export手动导出。在Blender中默认是试用FBX 7.4 binary来导出,这就是问题所在,所以我们要改成用FBX 6.1 ASCII来导出。
    • FBX6.1也有自己的问题,首先Scale不起作用了。然后设置Forward为Z Forward,除了Armature和Mesh需要导出外,其他的都去掉,然后导出。
    • 到Unity中发现,Unity会用0.01的Scale来导入,导致人物非常小,所以要去掉Unity中Use File Scale的导入选项,然后法线就对了,但是脚还是不对。
    • 到Blender中,需要删除两只脚的最后一根骨头,然后自己在新建同样的骨头,最后在导出到Unity就对了。

      UMA 301 - Part 5 Troubleshooting Blender Exports

  2. 拆分并最终确定我们的模型

    • 在老版的UMA中,必须拆分模型为几个部分,方便穿衣服的时候,不显示相应的身体部分(避免穿模)。因为新版UMA支持Mesh Hide Asset,可以解决穿模问题,所以不是必须拆分模型的。但是我觉得还是拆分模型的runtime性能要高些吧。
    • 还有如果有BlendShape的话,把使用BlendShape的部分Mesh拆分出来,那么只有那部分Mesh会有多个BlendShape的顶点copy,其他部分就没有copy了,可以节省很多内存。但是到Unity中UMA还是会合并成一个Mesh,所以这些BlendShape还是会变成整个Mesh的BlendShape,同样浪费比较多的内存。(只是我的猜测)
    • 在拆分之前,UMA需要一个Unified Mesh用来在缝合拆分Mesh时,修正缝合处的法线方向。所以需要先copy身体和眼球的Mesh,然后把copy的mesh合成一个Mesh,命名为Unified,还要把这个mesh上的BlendShape全部删除,因为没作用。
    • 然后就可以拆分Mesh了,把头拆分出来一个新的Mesh(其中的BlendShape也会保留着一起拆分了),命名为Head。
    • 拆分后,剩下的身体Mesh中,还是保留了BlendShape的(因为这些BlendShape是脸部表情,所以没有实际作用),需要把它们全部删除。

      UMA 301 - Part 6 Splitting and Finalizing our Model

  3. 创建一个基本种族(Base Race)

    • 先从原始的Fuse模型中,把我们需要用的Textures取出来,然后删除原始Fuse模型。
    • 确保我们导入的模型的transform中scale都是1。
    • 到模型的设置界面,选择Rig->Animation Type->Humanoid,然后设置Avatar。
    • 在Avatar设置界面,需要通过UMA->Extract T-Pose取出TPose给UMA备用,这会在UMA/Content/Generated/TPoses目录下生成一个UMA用的TPose文件,我们需要把这个文件copy到我们新建race的文件夹下面。
    • 打开UMA->Slot Builder,创建新的slots(方法见以前的备忘录),注意不需要创建Wardrode Recipe,还有需要缝合的slot,要设置Seams Mesh为Unified,不需要缝合的就把这选项置空。
    • 设置新创建的Overlay,需要指定贴图。
    • 通过UMA->Core->Text Recipe新建一个Recipe,这个是base race需要的一个recipe。
    • 通过UMA->Core->Race Data新建一个Race Data。
    • 把整个新建的文件夹拖入UMA Global Library。
    • 设置RaceData,把text recipe设置到Base Race Recipe字段中,TPose文件设置到T-Pose字段,设置好名字,可以添加和删除Wardrobe Slots。
    • 然后设置Text Recipe,把它命名为BaseRecipe,把RaceData设置到RaceData字段,点击Add to Global Index,把身体slot和对应的overlay加入其中。
    • 因为这个FuseRace,和UMA自带的Race的骨架结构不相同,所以需要勾选Dynamic Character Avatar->Active Race->Race Change Options->Rebuild Skeleton选项,才能在各个race间正常切换。
    • 只有在运行时需要切换race,而且race的骨架不一样,才需要勾选Rebuild Skeleton选项,其他时候不需要,因为有效率影响。
    • 如果需要BlendShape起作用,需要勾选Dynamic Character Avatar->Advanced Options->Load BlendShapes选项。
    • 如果某个骨骼(必须是叶子骨骼?不是很确定)不影响mesh中的任何一个顶点,那么在生成slot的时候就不会包含这个骨骼的信息,同样在合成最终mesh生成相应的skeleton的时候也会没有这些骨骼。

      UMA 301 - Part 7 Creating a Basic Race

  4. 设置骨骼DNA

    • 新建UMA->DNA->Dynamic DNA Converter,打开新建的文件,通过Dynamic DNA->Create Dynamic DNA Asset新建Dynamic DNA Asset。
    • 打开Dynamic DNA Asset,新建一些DNA Name(名字有两部分组成,身体部位和这个部分的属性,比如overallHeight)。
    • 把Dynamic DNA Converter设置到RaceData的Dna Converter List中。
    • 打开UMA->Examples->Extensions Examples->DynamicCharacterSystem->Scenes->UMA DCS Tool - DNAConverterBehaviour,选择我们新建的race。
    • 然后设置不同的DNA,选择需要调整哪个骨骼的哪些属性。还可以增加很多操作到一起。最后调整完了,需要save的。

      UMA 301 - Part 8 Setting up bone DNA

  5. 设置BlendShape DNA

    • 新建一个FuseMorphConverter的GameObject,在上面添加Morph Set Dna Converter Behaviour脚本,把这个GameObject变成一个Prefab,命名为FuseMaleMorphConverter。
    • 通过UMA->DNA->Dynamic DNA Asset新建DNA Asset,命名为FuseMaleMorphUMADnaAsset。
    • 通过UMA->DNA->Morph Set DNA新建Morph Set DNA Asset,命名为FuseMaleMorphSetDnaAsset。
    • 把FuseMaleMorphUMADnaAsset中的Dna Type Hash拷贝到FuseMaleMorphSetDnaAsset中的Dna Type Hash中,还要拷贝到FuseMaleMorphConverter中的Dna Type Hash中。
    • 把FuseMaleMorphUMADnaAsset设置到FuseMaleMorphConverter的Dna Asset中,把FuseMaleMorphSetDnaAsset设置到FuseMaleMorphConverter的Morph Set中。
    • 在FuseMaleMorphUMADnaAsset中新增DNA Name。
    • 在FuseMaleMorphSetDnaAsset中设置哪个DNA影响哪个BlendShape。BlendShape的名字可以从UMARenderer->SkinnedMeshRenderer->BlendShapes中查看。
    • 把FuseMaleMorphConverter加入到RaceData的Dna Converter List中。
    • 把新进的这些Assets加入到UMA Global Library中。
    • 注意FuseMaleMorphUMADnaAsset中的DNA名字的顺序,和FuseMaleMorphSetDnaAsset中Dna Morphs的顺序必须相同。

      UMA 301 - Part 9 Creating Blendshape DNA

  6. 创建非人形UMA种族

    • 把需要的FBX导入blender,修改其骨架结构,加入Global和Position骨骼,并且把armature的名字改成Root,这样到unity中就有Root->Global->Position这样的骨架了。
    • 这样修改后,原本的动画就不能用了,因为骨架变化了,所以需要把所有的动画导入Blender,然后做同样的骨架修改。
    • 接下来的步骤和human race是一样的。

    UMA 301 - Part 10 Non-Humanoid UMA Races