给定一个具有定义顶点(x, y, z)的凸多面体,用来指定多面体的面。
如何计算多面体每个面的表面法线?
我需要表面法线以计算顶点法线来执行Gouraud shading。关于如何做到这一点,我只能找到Newell方法的线索,但是如何确保法线是外向而不是内向的呢?感谢任何帮助。
如何计算多面体每个面的表面法线?
我需要表面法线以计算顶点法线来执行Gouraud shading。关于如何做到这一点,我只能找到Newell方法的线索,但是如何确保法线是外向而不是内向的呢?感谢任何帮助。
计算面的法线向量
需要计算出跨越包含给定面的平面的两个向量的叉积,得到该面的(非单位)法向量。需要对其进行归一化处理即可完成计算。
如果x0
、x1
、x2
是三角形面的顶点,则可以按以下方式计算法向量:
vector3 get_normal(vector3 x0, vector3 x1, vector3 x2)
{
vector3 v0 = x0 - x2;
vector3 v1 = x1 - x2;
vector3 n = cross(v0, v1);
return normalize(n);
}
x3
是测试期间的视点。| x0.x x0.y x0.z 1 |
| x1.x x1.y x1.z 1 |
| x2.x x2.y x2.z 1 |
| x3.x x3.y x3.z 1 |
x3
在由CCW点{ x0, x1, x2 }
定义的平面的+
一侧。x3
在由CCW点{ x0, x1, x2 }
定义的平面的-
一侧。x3
与{ x0, x1, x2 }
共面。旋转顶点的顺序(通过将它们全部向左或向右移动)不会改变方向。因此,{ x0, x1, x2 }
与{ x2, x0, x1 }
和{ x1, x2, x0 }
具有相同的方向。
但是,如果交换两个连续的元素的顺序,则也会交换到相反的方向。这意味着{ x0, x1, x2 }
与{ x1, x0, x2 }
具有相反的方向。
使用这些信息,您可以轻松地定向您的三角形:使用谓词矩阵测试每个三角形。如果测试失败,只需交换任意两个连续的顶点元素的顺序,问题就解决了。
x3
设置为多面体的中心(在模型空间中特别容易,因为原点是中心),这样每当您得到一个负矩阵时,就知道x3
在负侧,这意味着外部方向将是正侧。 - plasmacel