计算法向量/垂直向量

网格生成期间经常需要用到法向量(即垂直于平面的向量),它对于路径跟踪和其他情况也非常有用。在平面上给定三个点(即三角网格的顶点),就很容易找到法线。从三个点中选取任意一个点,然后将该点与另外两个点相减即可得出两个向量:-

var a:Vector3;
var b:Vector3;
var c:Vector3;

var side1:Vector3 = b - a;
var side2:Vector3 = c - a;

这两个向量的叉积将得出第三个向量,该向量垂直于表面。“左手坐标系”可用于确定将这两个向量传递至叉积函数的顺序。向下看表面顶部(其法线由内指向外侧)可知,第一个向量应按顺时针方向指向第二个向量:-

var perp:Vector3 = Vector3.Cross(side1, side2);

如果将输入向量顺序颠倒过来,所得向量将指向完全相反的方向。

网格中的法向量必须为单位向量。您可使用单位化属性将其设为单位向量,但也可使用另外一个偶尔有用的诀窍。您还可将垂直向量除以自身量值,所得即为单位向量:-

var perpLength = perp.magnitude;
perp /= perpLength;

事实证明,三角形的面积等于 perpLength / 2。如需计算整个网格的表面积或需要根据其相对面积按概率随机选择三角形,则可使用此公式。

Page last updated: 2013-06-27