需求:将一段bvh的动捕数据,添加到fbx模型中,输出fbx模型
这个需求乍一看很简单,只需要先这样,再那样,最后就出来了。不错,思路确实很简单,用Threejs 把模型渲染出来,然后用BVHLoader,把动画提取出来,最用exporter 导出不就完事了么,嗯,对也不对。
1. 加载模型
加载模型,就是看碟下菜,什么格式什么加载器,路径往上一怼就完事了,贴图费点事儿,想个名字挺难的。费了老鼻子劲了,完事儿一看,模型光秃秃的,我图呐。一查看color和emissive 有问题,使用贴图的时候,就不能是白色,改!
2. 加载bvh
bvh 没啥可说的,动捕嘛,懂的都懂,不懂的看看最近的国产动漫,都在用动捕。加载出来创建一个辅助体查看动作,攒劲的舞蹈,我喜欢。点到animations 里面看看关键帧数据,嗯,熟悉的样子。唯一需要担心的是帧动画关节部位的名称和具体的模型骨骼对不上,到时候需要收集一下做映射,好在我这个模型就是对应的。
3.绑定动画
绑定动画的流程异常轻松,就bvh加载出来的animation 添加到fbx的animations上面就行了,有点借腹生子的意思,弄个混合器播放一下,这人怎么倒头就睡啊,在地上跳,不像话,八成是动画,里面的方向和threejs 里面不太一样,用绕轴旋转一下吧,嗯,挺好,上家公司吃的苦,沉淀下来了。
4.导出GLTF
简单来说,就是需要花大精力编译和解析,Threejs官方不想弄,所以不存在FBXExporter,这可愁怀我了,搞半天不能导出,孤芳自赏可不行啊,先整个gltf/glb 试试。没啥可说的,gltf需要的是Json,glb 需要的是ArrayBuffer,灵魂汁子,浇给。丢到gltf-viewer.donmccurdy.com/ 里面跑一下,啧啧啧,人物的贴图就然水灵灵的翻转的,人不人鬼不鬼,得,导出的时候克隆一下模型,贴图翻转一下
clonedMaterial.Map.repeat.y *= -1;
5. 导出FBX
先问问gpt吧,都是虚空创建一个包,直接导出,眼瞅着指不上了,只能上建模工具了,blender 重磅登场。blender 第一次是真难用,操作方式太难受了,找个教程暴风吸入,直到勉强能用了。遇到的第一个问题就是glb导出成fbx 模型,动画丢了,动画帧里面只有一头一尾的两个点是亮的,不是连续的能叫动画么。找半天攻略,直接送上配置
接下来的事儿就是找大佬根据blender 提供的服务封装接口了,完美
6.小插曲
完事了嘛,没有,临了,还蹦出来个问题,有一个模型转出来的gltf/glb 在blender 中解析不出来,在threejs 中挺好。还是用gltf-viewer.donmccurdy.com/ 跑一下
天都塌了,这数据问题,我哪懂啊,打印所有的顶点也没有出现NaN的情况,没啥办法,也不知道这个accessors 是不是按照模型顺序创建的,在控制台里面,挨个隐藏模型的部分,看看是哪儿一块的原因影响的,诶嘿,第一个就中奖了,点开geometry.attributes,多了一些奇奇怪怪的属性,不是说就应该有定点,法线,uv么,怎么还有个uv1,删除一下,下载,验证,完美解析,终。