Yu-*_*hen 5 c++ 3d geometry normals computational-geometry
给定一个凸多面体,其顶点定义为 (x, y, z),指定多面体的面。
如何计算多面体每个面的表面法线?
我需要表面法线来计算顶点法线来执行Gouraud 着色。我能找到的关于如何做到这一点的唯一线索是 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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,叉积遵循右手法则:
右手法则指出向量的叉积的方向是通过将u和v尾对尾放置,将右手展平,在u的方向上延伸,然后将手指朝该方向卷曲来确定的v与u的夹角。然后拇指指向cross(u, v)的方向。
定位你的三角形
为确保所有法线都指向多面体的内部/外部,三角形必须一致定向,这意味着所有顶点必须遵循逆时针 (CCW) 或顺时针 (CW) 顺序。这在计算机图形学中也称为缠绕。
您可以通过计算下面矩阵的行列式来检查三角形的方向,其中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 |
Run Code Online (Sandbox Code Playgroud)
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 }
。
使用此信息,您可以轻松地确定三角形的方向:使用谓词矩阵测试每个三角形。如果测试失败,只需交换任意两个连续顶点元素的顺序即可解决问题。
归档时间: |
|
查看次数: |
2070 次 |
最近记录: |