2024-06-29 07:36:39
您好,可以这样做
对于立方体来说,如果要表现出棱角,顶点的法线方向必须与所在面的法线方向一致
而如果是球体这样的光滑物体,可以使多个顶点共享法线方向。
所以说,并不是3ds max采用了错误的方式处理法线,相反它提供了一些方法可以自由修改法线方向,而修改后的法线方向也可以不依赖平面表面的法线方向,单独记录。
向量的叉乘可以用左手或者右手帮助记忆(对应的是你在API中使用了左手坐标系还是右手坐标系,opengl是右手系,d3d默认是左手系),竖起拇指,伸直食指,然后将中指伸到与这两根手指呈90度角。设拇指为向量1,食指为向量2,中指的方向就是叉乘后向量3的方向。
法向量应该是一个单位向量,否则光照的结果就不正确。如果你已知的几个法向量都是单位向量的话,求他们的平均值就可以了。但特别要注意最后和为0的情况(正好一正一反两个法线求和时)。
这是由建模决定的,虽然建模时应当极力避免许多多边形共享一个顶点,但程序上也有必要保证这种情况的正确性。
最烂的办法就是挨个去比较,但是如果你能有效将顶点进行hash的话,使用stl map也可以快速对顶点定位。我的尝试结果是宁可选用一个看上去不利落的办法对顶点进行hash,也比穷举法来得要快。
在你实际着手计算法线之前,最好先弄明白法线为什么要单独保存。事实上你完全不需要手动重新计算法线方向,直接采用工具编辑过并导出的数据就可以了。不但没有额外的工作量,还给美术在模型外观上的发挥留下一定的余地。