上一篇博文《生成点法线 》首先从理论的角度描述了点法线的含义,接着给出了一个生成点法线的标准算法,最后基于标准算法进行了一些改进。
如果你不喜欢读长篇的理论来了解知识;如果你比较喜欢通过一个Demo来了解知识;如果你对点法线的生成比较感兴趣。那么本文就是为你而写的。
本文组织如下:首先给出生成点法线的步骤;接着给出一个三角网格模型格式;最后基于该网格模型格式,给出一个生成点法线的函数。
点法线生成步骤:
- 1 生成面法线
- 2 对顶点数据进行预处理,使得通过给定的顶点就可以索引到其所在的所有三角形
- 3 对于任意一个顶点,得到其所在的所有三角形。选定其中一个三角形作为该顶点技术上所属的三角形,然后缓存其对应的面法线。然后对于其他的三角形,计算其面法线与缓存的面法线的点积,如果点积大于某一个阈值,则该面法线将应用于求点法线。否则该面法线将作为在该三角形中,该点的点法线。
- 4 将求得的点法线标准化。然后将它与参与计算点法线的面线所在三角形的该点联系起来。
三角网格模型格式:
- 1 该三角网格模型存储在一个二进制文件中
- 2 该三角网格模型由多个三角形组成
- 3 每个三角形由12个浮点数组成。前三个浮点数表示该三角形的面法线。后九个浮点数分别表示该三角形的三个顶点。
- 4 各个三角形之间没有分隔符
那么该文件看起来像是这样:GLfloat GLfloat GLfloat …
点法线生成函数剖析:
面法线效果图 vs 点法线效果图:
其中左图是面法线效果图,右图是点法线效果图。看起来差距还是很明显的。