Unity 批处理模型转Humanoid

发表于2018-11-05
评论7 1.45w浏览

前一段时间做了点小玩意,跟华为最近发布的新手机中的一个炫酷的功能撞衫了。


主要功能是:3D扫描出模型点云,然后将数据上传到服务器,建模绑定骨骼,输出模型动画文件,然后下载到移动端,并在AR场景中应用

我们的产品还没有开始宣传,可以先看一下这个华为的宣传视频里面的流程效果,基本是一样的。(本人非菊花厂员工,无广告嫌疑)


3D扫描是公司已有的产品,我的工作是将点云文件转换成模型文件,并绑定上人型骨骼,然后输出到移动端,在AR场景中展示出来。产品和华为的思路一模一样。(不过华为已经发布了,我们还是晚了一步

当时看到华为手机中熊猫的动作列表和演示播放的几个动作,我就知道了菊花厂的工程师用的骨骼绑定是github上一个开源的骨骼绑定框架,因为那套代码我们也测试过,健壮性不错,轻量级的C++开源代码,感谢开源精神。(不过我们没有采用这套方案)



在这因为还牵扯到很多商业机密,我就只分享点边角料的技术吧。

如何用Unity在批处理中将普通的FBX模型文件的AnimationType转换为Humanoid类型。(虽然说是边角料,但是学会这个技能是可以帮助我们很多程序员实现正常下班梦想大有裨益)


熟悉Unity中Mecanim的同学应该都知道,Mecanim中提供了一个非常非常好用的功能:


Retargeting(运动重定向)功能,即把动画从一个角色模型应用到另一个角色模型上。

这样不同的模型文件,不同的模型制作人员制作的不同的动画都可以大幅的提示复用度,大家再也不用担心不同的骨骼动画文件不能其它模型上播放的问题。这个功能必须点赞,而且我们开发工程师只需要在编辑器中点点按钮就帮我们做好了。


今天要分享的是 不通过Unity编辑器中手动操作,如何通过程序来自动将导入的FBX模型文件的AnimationType调整为Humanoid,并进行一次T-Pose校正,然后输出AssetBundle到指定的目录。

先来看一个流程图:

将程序自动将模型转换为Humanoid Avatar的实现:

自动导入Unity的文件:
可以点击下面两个Unity的官方链接来了解一下模型处理中用到的几个重要的类:

下面给出创建代码:
private static HumanDescription ReadHumanDescription()
    {
        HumanDescription humanDescription = new HumanDescription();
        List<HumanBone> humanBones = new List<HumanBone>();
        HumanTemplate template = Resources.Load(humanTemplateFile) as HumanTemplate;
        ... // 篇幅受限 忽略无关代码
        humanDescription.human = humanBones.ToArray();
        ... // 篇幅受限 忽略无关代码
        List<SkeletonBone> skeletonBones = new List<SkeletonBone>();
        for (int i = 0; i < skeletonDescription.Length; i++)
        {
            SkeletonBone newSkeletonBone = new SkeletonBone();
            ... // 篇幅受限 忽略无关代码
            skeletonBones.Add(newSkeletonBone);
        }
        humanDescription.skeleton = skeletonBones.ToArray();
        return humanDescription;
    }
    private static Avatar CreateAvatar(GameObject go)
    {
        HumanDescription desc = ReadHumanDescription();
        ... // 篇幅受限 忽略无关代码
        Avatar avatar = AvatarBuilder.BuildHumanAvatar(go, desc);
        ... // 篇幅受限 忽略无关代码
        avatar.name = "avatar";
        return avatar;
    }
当然经常在Unity中手动处理的同学应该也遇到过这个问题:模型导入自动绑定后,模型的动作会有问题,这个时候我们手动点一个 Enforce T-Pose的按钮就能搞定这个问题。这个时候因为我们要自动化处理,就需要在代码中将这个处理掉,下面是Unity中的T-Pose的数据:
然后在在我们自定义的ModelImporter中将当期处理的导入数据修改为Human:
ModelImporter modelImporter = assetImporter as ModelImporter;
modelImporter.animationType = ModelImporterAnimationType.Human;
modelImporter.humanDescription = ReadHumanDescription();
有了这些处理,当我们自动将一个FBX文件导入Unity中后,会自动处理为我们的的Human类型

点击模型查看Rig页签会看到AnimationType已经是Humanoid

再点击Configure按钮会看到模型也都映射完成。

基本功能写完,剩下的就要进行批处理了:


这个地方用到了Unity提供的命令行模式,具体的参照连接:

下面给出部分Python代码

https://docs.unity3d.com/Manual/CommandLineArguments.html
篇幅太长,论坛里无法保存,就先不贴代码了

模型处理完,然后客户端从服务器上把模型下载下来就可以完美运行了。

另外这里面还牵扯到将点云文件(ply)转成模型文件fbx,并进行骨骼绑定的处理,这里就先不讲了,感兴趣的同学可以添加微信相互学习沟通。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引