我的目标是检查STL文件中三角形的正常方向是否一致?
例如。 STl文件如下所示,我想检查所有方面是否在同一方向,即向外。??
facet normal 0 0 -1
outer loop
vertex -20.5411 -4.36615 0
vertex -16.9894 -12.3435 0
vertex -19.1845 -8.54147 0
endloop
endfacet
facet normal -0.994522 0.104528 0
outer loop
vertex -21 0 0
vertex -21 0 2
vertex -20.5411 4.36615 0
endloop
endfacet
我想通过顶点的叉积来计算法线,但我怎么知道方向?
我读过"循环单位向量的交叉积是正数。"但是我应该如何在我的问题中使用这个规则?
任何人都可以帮助我吗?我真的被困在这里:(
答案 0 :(得分:1)
检查正常的点积和2个边缘方向的叉积的符号,例如给定正常A
和点B
,C
,((B - A) x (C - A)) * N
:
S
交叉积应生成与法线方向相同的向量,因为2个向量T
和S * T = |S| * |T| * cos(theta)
的点积为
theta
其中boolean check(Point3D normal, Point3D p1, Point3D p2, Point3D p3) {
return p2.subtract(p1)
.crossProduct(p3.subtract(p1))
.dotProduct(normal) > 0;
}
是向量之间的角度,当且仅当方向正确时,这应该是正的。 (这里假设三角形中没有2个点位于同一位置)
Java代码示例(使用javafx.geometry.Point3D
):
{{1}}
答案 1 :(得分:0)
找到Z坐标较高的三角形,检查法线是否几乎向外(Z +方向)或几乎向内(Z方向)。一旦你知道这一点,只需移动到未访问的相邻三角形,检查正常翻转并将它们标记为已访问。
访问完所有三角形后,停止。