给定凸三维多边形(凸包)如何确定正常表面/顶点向量的正确方向?由于多边形是凸的,所以正确的意思是朝外(远离质心)。
def surface_normal(centroid, p1, p2, p3):
a = p2-p1
b = p3-p1
n = np.cross(a,b)
if **test including centroid?** :
return n
else:
return -n # change direction
我实际上需要正常的顶点向量,因为我要导出为.obj文件,但我假设我需要先预先计算表面向量并将它们组合起来。
答案 0 :(得分:1)
此解决方案应在3d中凸壳的假设下工作。您可以计算问题中显示的法线。您可以使用
标准化法线向量n /= np.linalg.norm(n) # which should be sqrt(n[0]**2 + n[1]**2 + n[2]**2)
然后,您可以计算输入三角形的中心点:
pmid = (p1 + p2 + p3) / 3
之后,您计算三角形中心到表面质心的距离。这是
dist_centroid = np.linalg.norm(pmid - centroid)
您可以使用距质心距离的长度计算triangle_center +法线的距离。
dist_with_normal = np.linalg.norm(pmid + n * dist_centroid - centroid)
如果此距离大于dist_centroid,那么您的法线面向外。如果它更小,它指向内部。如果你有一个完美的球体并指向质心,它应该几乎为零。对于您的一般表面可能不是这种情况,但表面的凸度应该确保,这足以检查其方向。
if(dist_centroid < dist_with_normal):
n *= -1
另一个更好的选择是使用标量产品。
pmid = (p1 + p2 + p3) / 3
if(np.dot(pmid - centroid, n) < 0):
n *= -1
检查您的法线和从三角形中心到质心的矢量是否具有相同的方向。如果不是这样,请改变方向。