Unity 批处理模型转Humanoid
前一段时间做了点小玩意,跟华为最近发布的新手机中的一个炫酷的功能撞衫了。
主要功能是:3D扫描出模型点云,然后将数据上传到服务器,建模绑定骨骼,输出模型动画文件,然后下载到移动端,并在AR场景中应用。
我们的产品还没有开始宣传,可以先看一下这个华为的宣传视频里面的流程效果,基本是一样的。(本人非菊花厂员工,无广告嫌疑)
当时看到华为手机中熊猫的动作列表和演示播放的几个动作,我就知道了菊花厂的工程师用的骨骼绑定是github上一个开源的骨骼绑定框架,因为那套代码我们也测试过,健壮性不错,轻量级的C++开源代码,感谢开源精神。(不过我们没有采用这套方案)
在这因为还牵扯到很多商业机密,我就只分享点边角料的技术吧。
如何用Unity在批处理中将普通的FBX模型文件的AnimationType转换为Humanoid类型。(虽然说是边角料,但是学会这个技能是可以帮助我们很多程序员实现正常下班梦想大有裨益)
熟悉Unity中Mecanim的同学应该都知道,Mecanim中提供了一个非常非常好用的功能:
Retargeting(运动重定向)功能,即把动画从一个角色模型应用到另一个角色模型上。
这样不同的模型文件,不同的模型制作人员制作的不同的动画都可以大幅的提示复用度,大家再也不用担心不同的骨骼动画文件不能其它模型上播放的问题。这个功能必须点赞,而且我们开发工程师只需要在编辑器中点点按钮就帮我们做好了。
将程序自动将模型转换为Humanoid Avatar的实现:
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; }
ModelImporter modelImporter = assetImporter as ModelImporter; modelImporter.animationType = ModelImporterAnimationType.Human; modelImporter.humanDescription = ReadHumanDescription();
基本功能写完,剩下的就要进行批处理了:
这个地方用到了Unity提供的命令行模式,具体的参照连接:
下面给出部分Python代码
https://docs.unity3d.com/Manual/CommandLineArguments.html 篇幅太长,论坛里无法保存,就先不贴代码了
模型处理完,然后客户端从服务器上把模型下载下来就可以完美运行了。
另外这里面还牵扯到将点云文件(ply)转成模型文件fbx,并进行骨骼绑定的处理,这里就先不讲了,感兴趣的同学可以添加微信相互学习沟通。