前言
几个月之前,我曾经写了一篇文章,针对蛋疼的 Maya 法线解锁问题。
主要起因是 FBX 可能没有导出平滑组,导致Maya解锁法线会丢失法线数据。
当时的解决方案可以自动找到软边,然后进行平滑边操作,但是如果模型包含一些特殊修改的法线的话就不奏效了。
为了解决这个问题,我又进行了多方面的努力。
将代码拷贝到 Maya 运行即可获得一个解锁法线页面
平滑查找
这次的解锁法线会自动计算当前模型边是否否和平滑法线的角度,针对边法线的情况发成了两种情况
- 点平滑
- 边平滑
点平滑就是完全 average 平均化的顶点,这种顶点的法线就是完全重合并且取的是这点四个面的法线平均值。
而边平滑的情况则是这个边上的两个点的法线分别是这条边相邻的两个面的法线平均值。
通过上述的两种情况判断,就可以找到所有的平滑边和点。
不符合上述的两种情况就是特殊调整边或者硬边,这里不需要做区分,因为硬边也不会被锁定,所以执行软化边也没问题。
而且特殊锁定的顶点解锁之后其实就是读取了 OpenMaya 的 isSmooth 方法,如果方法返货 false 就自动是硬边了。
因此特殊调整过的就不属于软边的范畴。
通过上面的方法就可以相对完美解决 3dsMax 软件导入模型到 Maya 之后丢失法线修改信息的问题。
只可惜上述的方法求平均值比较存在较大的误差,因此需要添加一个阈值来锁定判断的范围,这个阈值范围就比较玄学了。
基本原理其实和上一篇文章相差不大,另外就是多了调用 OpenMaya 的 setFaceVertexNormals 方法来批量修改模型法线而已,区别并不是很大。