法线表面/顶点矢量的方向



给定一个凸的 3d 多边形(凸包) 如何确定法线曲面/顶点向量的正确方向?由于多边形是凸的,正确的我的意思是朝外(远离质心)。

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 文件时,我实际上需要正常的顶点向量,但我假设我需要事先计算表面向量并将它们组合在一起。

此解决方案应在 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

这将检查法线和从三角形中间到质心的矢量是否具有相同的方向。如果不是这样,请改变方向。

最新更新