关于蒙皮权重镜像匹配问题介绍以及解决方案
# 关于镜像权重的问题介绍以及解决方案
角色模型在骨骼蒙皮阶段,通常只需调整一侧的权重,另外一侧的蒙皮权重对称镜像过去即可,但是长期以来感觉 3dsMax的蒙皮镜像功能却并不好用。
明明模型和骨骼都是对称镜像的,但还是会出现不能理想 镜像蒙皮权重 的情况,
本文是在日常工作中
尝试解决权重镜像错误问题总结出下面几个观点。
骨骼外形大小影响镜像 匹配。
镜像阈值 是越小,镜像匹配越准。
骨骼的包围盒中心 不要重合,否则影响镜像匹配。
模型需要清理,如重置变换,和Box 合并等操作,否则可能影响匹配。
部分3dsMax 版本的 Skin 有BUG,需要重启之后 才能正常镜像匹配。
本文只讨论 前 3 个观点,镜像匹配 是指 首图中 左绿 右蓝这样的封套显示情况。。
# 一. 现有的镜像方式说明
# 1.Skin修改器镜像权重操作介绍
如上图,按下 Mirro Mode 后开启Skin修改器的镜像模式,此时蒙皮封套将以MirrorPlane 镜像平面为轴线分为 左侧绿 中间红 右侧蓝 这样三色匹配显示。
如果绿色封套和蓝色封套都一一匹配对应之后,就可以选择你喜欢的 按钮 镜像权重了,如下图。
- 黏贴选中点。
- 将绿色骨骼权重黏贴到蓝色骨骼。
- 将蓝色骨骼权重黏贴到绿色骨骼。
- 将绿色点权重黏贴到蓝色点。
- 将蓝色点权重黏贴到绿点。
除了第一个按钮,黏贴选中点之后,无轮黏贴骨骼还是权重点,镜像效果都一样的,随个喜好。
镜像蒙皮权重的操作就是这么简单,但是重点在于绿蓝色封套匹配是否正确以及如何提高匹配率。
# 2.镜像模式中颜色区分的介绍
- 蓝绿,镜像平面两侧识别到互相镜像的骨骼。
- 红,未识别有互相镜像的骨骼。
理想情况下每选中 一根蓝色或者绿色骨骼,都会点亮另一侧镜像的骨骼,如果蒙皮数较少,建议每个封套都选择试试检测一遍。
# 3.不容易发现的镜像匹配错误情况
别看两侧蓝蓝绿绿的,好像每根骨骼都识别匹配到了镜像骨骼,但是实际上只要你镜像阈值给的足够大,什么乱七八糟的骨骼都会变蓝或者绿,但匹配结果却不一定是对的。
两侧的镜像匹配识别也不是一致的,左侧能正确镜像识别到右侧,但是右侧不一定能正确识别到左侧,反之亦然。
选中一根 蓝色骨骼L_B_0 ,点亮另一侧镜像的绿色骨骼 R_B_0。
现在来选中绿色骨骼 R_B_0,可能出现点亮 两个 蓝色骨骼 L_B_0,L_B_1。如下 3 张图。
# 正常
# 错误1
# 错误2
因skin修改器没有开放相关的API,所以目前还没有工具检测镜像匹配是否正确,只能靠手动选择看绿蓝匹配的颜色变化。
# 二. 到底怎么设置好镜像?
目前我个人总结影响蒙皮权重镜像是否正常的有以下几个条件。
- 模型是否左右镜像。
- 骨骼是否左右镜像。
- 骨骼大小(length ,width ,height )。
- 两侧骨骼数是否一致,如一侧有5根骨骼,另一侧有6 根,镜像之后可能出现重复骨骼。
- 镜像阈值大小 MirrorThresh。
反直觉的是与 骨骼名字,封套大小都无关。
- 镜像权重之前,将模型两侧的骨骼设置的尽可能小,如 0.01 ,具体多小可自行测试,中间的骨骼反而可以设置大些,中间骨骼权重不用镜像。
- 检查左右两侧骨骼不是一样一致,一般情况下不太可能会出现会漏把骨骼添加到蒙皮,但小心检测总是不会错的。
- 然后再来调整镜像阈值大小,直到两 侧骨骼匹配正确。
这里提供一个快速设置骨骼大小和检测两侧骨骼的小工具,如下图
- 固定封套大小 ,勾选之后 所有封套一样大小,否则按骨骼大小自适应大小。
- 名字过滤,只处理 名字 包含设置的 字符串的骨骼。不勾选则设置全部蒙皮骨骼。
# 1.要合理设置蒙皮骨骼大小
由于bone骨骼轴心在骨骼的一端,骨骼形状越小,其重心就越接近轴心,就可以让镜像识别更精确。
如下面面部绑定中,骨骼密度较大,就将两侧的骨骼 大小设置的尽可能的小,提高蓝绿识别率,镜像之后再把骨骼大小调整回来。
同时加大中间骨骼,避免识别到镜像骨骼,中轴线上的骨骼不需要镜像,应保持为红色,同时保存较小的 Mirror Thresh 镜像阈值,避免错误匹配。
如上图,只是将 左侧骨骼 的大小设置为 1 之后 (length ,width ,height ),就出现大量骨骼无法识别镜像,骨骼越小,镜像识别率越高。
# 2.确保左右两侧蒙皮骨骼数量一致
镜像平面两侧的蒙皮骨骼数量不一致,可能不会影响 蓝绿 镜像识别,只是在镜像权重之后,出现某些点的权重重复骨骼,或者其他权重错误,无法正常镜像权重。
单选蒙皮模型,先查找 左边骨骼,是否有对应的右边骨骼,然后交换,查找右边的骨骼是否有对应的左边
骨骼,并且自动将缺少的骨骼添加的蒙皮中。
上图的 查找 【_R_】 ,意思是在蒙皮里检测 名字中带有 【_R_】的骨骼是否存在将【_R_】替换为【_L_】的命名骨骼,如果没有就自动添加到蒙皮中。
如上图,检测到蒙皮中少了 4 根 右边的骨骼,插件并自动将这些骨骼添加到蒙皮中。
fe_head_game 添加: FACIAL_R_EyelidUpperB4
fe_head_game 添加: FACIAL_R_EyelashesCornerOuter1
fe_head_game 添加: FACIAL_R_EyelidUpperB0
fe_head_game 添加: FACIAL_R_EyelidUpperB3
如上图 , 就是两侧骨骼数量不一致,镜像权重之后出现一个点重复骨骼。
# 3.Mirror Thresh 镜像阈值改小
一般情况下,大家在遇到开启镜像模式之后发现绿蓝识别不理想的情况下,都会被建议加大该值 。
这是错误的!!!
一味加大 MirrorThresh 阈值是能快速让红色封套变为绿色和蓝色,但是显示为绿蓝色不代表互相匹配正确,如果此时你去镜像复制权重,大概率会有很多权重错误。
阈值越大识别就越容易错误,不止是骨骼匹配,还有模型点和点之间的匹配。如果你的模型和骨骼本就不是对称的,那么可以加大阈值尝试镜像。
蒙皮修改器的镜像识别是根据骨骼包围盒重心来匹配镜像(不搜索骨骼命名),
3ds Max SDK\maxsdk\samples\modifiers\bonesdef\BonesDef_Mirror.cpp\void MirrorData
# 避免骨骼物体重心重合
蒙皮骨骼重合,是指两个骨骼的包围盒重心重合,如果两个骨骼不可避免的要轴心重合,那就要让他们形状不一样,只要形状不一样,重心也不会重合,如果连重心都重合了,就无法将他们两选择区分来匹配。
如下图的 【b_L_UpperArm】【b_LUpArmTwist】两个骨骼就是位置旋转缩放完全重合,形状一样,只是半径不一样,两个骨骼的重心是重合的。
结果镜像权重时,无法正确匹配。
无法正确左右匹配,左边一根骨骼匹配右边两个骨骼
解决办法就是让两骨骼的形状差异变大,改变他们各自的重心,这样镜像匹配时就不会出问题。
常见biped 的 Twist 扭曲过渡骨骼,如下图 虽然小臂和过渡骨骼是位置和旋转缩放数值是重合的,但是外形却差异很大,所以重心并不重合,很少出现无法匹配的情况,几乎可以放心使用。
# 调整封套大小(长短)
虽然封套的长短 不影响镜像蓝绿识别,也不影响镜像权重的结果,但不合适的封套长度看着太难受,可批量设置长度。
- 固定封套大小 ,勾选之后 所有封套一样大小,否则按骨骼大小自适应大小。
- 名字过滤,只处理 名字中 包含 设置的 字符 的骨骼。
封套长短 不影响镜像蓝绿识别,也不影响镜像结果。
目前 支持 bone ,box , point 这3 种骨骼的封套大小自适应,biped 支持后续添加。
# 三. 关于选中权重点进行镜像的使用说明
本身有选中部分权重点进行镜像功能,但大多数同学不了解
如题,不是整体镜像,是只镜像在蒙皮模式下选中点的权重,需要哪里就镜像哪里,修整权重非常快。
打开 Mirror Mode 模式,
选择正确的 Mirror Plane镜像平面, 让两边互相镜像的骨骼封套显示为绿色和蓝色,即是正确识别的镜像骨骼,如果封套显示红色,表示无法匹配到镜像骨骼的封套。
选中 任意一个骨骼封套,然后选中需要镜像的部分权重点 ,点击 MirrorPaste 即可镜像这选中点。
如上图,右侧黄色点是 手动选中的点,左侧绿色是自动选中识别的镜像点。 MirrorPaste 镜像黏贴 就是将选中的点权重镜像到 绿色自动识别的镜像点上。