本文已参与「新人创作礼」活动,一起开启掘金创作之路。
首先,顶点法线都是从面法线加权平均计算得到。所以有两个维度,一是哪些面参与计算,二是权重如何计算。
一 哪些面参与计算 如果建模工具导出了光滑组,那么方案一是直接使用光滑组信息,属于同一个光滑组的面参与计算。 方案二是同时使用光滑组信息以及面的夹角的阈值。 方案三是只使用面的夹角阈值。此时需要注意的是,由于建模工具没有导出光滑组,也就是说所有三角形都是默认同一个光滑组,那么如果三角形有共享顶点,且满足夹角阈值,就需要将共享顶点复制出来,对应不同的法线。
二 权重如何计算 简单方案是没有权重,共享顶点的三角形对该顶点法线的贡献一样。但是这样会有一些问题。 参考这个文章:Weighted Vertex Normals 此文的作者开发了一个3dMax插件,可以计算顶点法线。在文章中作者提出如果没有权重存在两个问题: 1)非常小的面也会对顶点法线产生比较大的影响。 2)在同一平面上的两个三角形对顶点法线的影响重复了。 所以在这篇文章里面,作者采用三角形面积作为权重解决第一个问题,采用共享顶点的三角形从该顶点出发的两条边的夹角作为权重解决第二个问题。这两个权重相乘即可。 我一开始理解采用夹角作为权重,以为是两个面的夹角(即第一个维度用于阈值判断的夹角),但是实际操作时发现这个似乎没什么意义,而此篇文章作者讲述的方案比较有意义。只是文章中伪代码计算向量的地方似乎反了,或者说那不是减号而是一个记号。