魔域简体-FBX骨骼生长缩放导出规范
# 魔域简体-FBX骨骼生长缩放导出规范
因C3 引擎的独特性,魔域项目中有大量的物体缩放生长设计资源,使用自有标准的C3格式,没有支持其他引擎的制作标准,但现在越来越多的资源需要导进 Unity 中配合制作特效,需要相关的制作规范文档和处理工具。
带骨骼缩放的动画资源,在Unity 中出现蒙皮错误,无非就是 缩放,位置 的 XYZ轴非法数值 或者 模型导出,问题,而 UE的兼容性更高,更难表现出错误。
如下图,播放动画时,蒙皮崩坏。
# 检测处理工具
自动处理带有缩放的骨骼,打断骨骼链,让缩放总是在最后一节骨骼上。【检测是否有缩放值03.ms (opens new window)】
# 塌陷约束绑定
# 【路径约束 v.14】
认准插件版本 【路径约束 v.14】 该工具创建的路径约束绑定,可直接安全导出,不需要做什么处理, 插件创建绑定时,就已经把骨骼链打断连接到根骨骼上。
# 【曲线IK - NDSplineIK 】
认准插件版本 该工具创建的曲线约束绑定,需要转拉伸为缩放后导出。
# 要删控制器?
用约束绑定工具组中的 工具 创建的绑定,如果需要删除控制器,就需要塌陷全部骨骼的动画之后才能手动删除控制器。
手动塌陷
samples 采样值是动画长度。
# 导出FBX资源?
- 路径约束插件创建的绑定不需要做什么处理,直接选中绑定的骨骼导出即可。只是需要注意导出 FBX 时勾选 Bake 烘焙动画。
- 曲线IK插件创建的绑定需要转拉伸为缩放之后导出。
手动导出FBX
插件导出FBX
# 3dsMax 中的 “缩放”
在 3ds Max 中缩放表现方式有两种。
- Bone.stretchTM
- Bone.Scale
分别是 Bone 物体特有的 【stretchTM】属性 和 物体的缩放动画控制器。
【stretchTM 】拉伸矩阵 无法被 导出,是X轴单向缩放,下文简称 为 拉伸。
【Scale】可被导出,可以灵活控制xyz轴向缩放,支持导出进引擎,下文中简称为 缩放。
# 【天晴动作组绑定工具 - NDSplineIk 】:stretchTM 方案
用该工具绑定的资源,如需导出FBX,需将拉伸转换为缩放处理,如不转缩放,也能导出,只是在引擎中蒙皮效果不对劲。
# 【天晴动作组绑定工具 - 路径约束 】:Scale 方案
用该绑定工具制作的资源本体可直接导出,无需更多处理步骤。
注意 以上 两种绑定的骨骼链接 差异。
既然有相应的处理方案了,为什么还是有人的资源进unity 出错?
因为更多情况下,魔域项目的动画大佬们还是 直接 一节节缩放骨骼,不使用插件,来制作各种花里胡哨的生长动画,导出C3没问题,但是导出FBX就不一定行了。
# 如何鉴别绑定是使用 【拉伸】还是【缩放】
如果骨骼有变长变短动画,选中查看骨骼属性。
如果 Bone On 没勾,可以肯定是缩放。
如果 Bone On 勾上 ,需要播放时看Stretch Factor数值是否有变化, 该值是拉伸比例,【stretchTM】X轴向。
拉伸转缩放,也只是将骨骼每帧的 拉伸比例 【stretchTM】 保存起来,然后关闭拉伸,最后将拉伸比例数值加到缩放值上。
一根骨骼可能会同时使用缩放和拉伸。
# 正确的导出模型
在3dsMax中导出模型FBX时,必须是无任何动画的模型,即第零帧骨骼是蒙皮状态。
同一个动画,不同方式导出的模型效果测试。
而之所以能看到右边这种错误,只是因为导出资源没有做到 模型和动画分离处理,一个FBX文件即是模型又是动画 ,如下图,在这个生长动画MAX中导出 带模型和动画的 FBX
这样直接导入 Unity后的模型会是错误的,骨骼模型始终应该是无动画状态!
可见问题出在 Skinned Mesh 上,其实只要替换一个 正常导出的 Skinned Mesh ,也可以正常播放播放。
UE5 就没这个问题。
综上,为了FBX资源有更好的引擎兼容性,需要在无动画状态下导出模型FBX。
在这个案例中,虽然骨骼是一节节的缩放生长,也没有打断骨骼链,只是改变了下导出流程,不改变骨骼连接,就可以在unity 中正常播放动画,那么其他文章中所说的 骨骼缩放应该总是在最后一节是不是有误呢?
# 均匀缩放和非均匀缩放
请看如下案例,3个有连接层级的box,用来模拟骨骼连接层级。
图1,其中层级 2 ,有X单轴的非均匀缩放。
图2 ,层级2 ,有 XYZ 均匀的缩放。
图1 案例的,非均匀缩放会让子级物体在旋转时发生型变,而图2 中的均匀缩放,就不会让子级旋转发生型变。
骨骼父子关系。每一个子级的骨骼,需要先获取到它的父级,通过矩阵来转换局部坐标系,算出子级相对父级的局部位移旋转缩放,再将坐标系转换到世界坐标系,得到子级相对于父级的位移旋转缩放在世界坐标的实际位置,得到最终在动画中这根子骨骼的实际坐标。
https://gwb.tencent.com/community/detail/132942# (opens new window)
在骨骼树上,我们的动画就是骨骼的局部矩阵数据,每个子级骨骼的世界矩阵数据都需要根据父级世界矩阵计算得出,这样在骨骼树上逐节计算,所以父级的缩放会影响到他的所有子级,并逐节累加,而这种非均匀缩放带来旋转型变,并不是动画需要的。
让 缩放总是在最后一节骨骼上,就是避免这种层级缩放矩阵计算影响,除非你的缩放总是均匀的。
Unity 2021.3 | UE5.2.1
UE5 不会!!
# 曲线非法数值
案例动画 有 400 帧,但如下图骨骼的前几十帧的 位置数值 缺是无穷小,导进 unity 中会报错,直接放弃导入该骨骼的位移数据。
此种错误,影响较小,具体错误影响会因动画幅度,骨骼位置而不同,除非运气不好,基本上都可以无视。
缩放的非法数值。
上图中的非法数值,其实不太好处理,只是被缩放的太小之后,看不清动画有什么不对,比如 缩放轴数值为负数,其实就相当于旋转了 180 度,如果要纠正缩放,那就要同步纠正旋转,但好在太小,看不到,就只是简单做个 数值上限下限 对比,例如 如果小于 - 999,就直接修改为 - 0.001
至于这些非法数值是怎么出现的,不太清楚,个人是从没遇到。