Numpy 法线曲面/顶点向量的方向

Numpy 法线曲面/顶点向量的方向,numpy,vector-graphics,normals,Numpy,Vector Graphics,Normals,给定一个凸面3d多边形(凸面外壳),如何确定法线曲面/顶点向量的正确方向?因为多边形是凸的,所以我所说的“正确”是指向外(远离质心) 在导出为.obj文件时,我实际上需要法线顶点向量,但我假设我需要先计算曲面向量,然后再将它们组合起来。此解决方案应在三维凸包的假设下工作。如问题所示,计算法线。可以使用 n /= np.linalg.norm(n) # which should be sqrt(n[0]**2 + n[1]**2 + n[2]**2) 然后可以计算输入三角形的中心点: pmid

给定一个凸面3d多边形(凸面外壳),如何确定法线曲面/顶点向量的正确方向?因为多边形是凸的,所以我所说的“正确”是指向外(远离质心)


在导出为.obj文件时,我实际上需要法线顶点向量,但我假设我需要先计算曲面向量,然后再将它们组合起来。

此解决方案应在三维凸包的假设下工作。如问题所示,计算法线。可以使用

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)
您可以使用到质心的距离长度来计算三角形_中心+法线的距离

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
dist_with_normal = np.linalg.norm(pmid + n * dist_centroid - centroid)
如果该距离大于距离形心,则法线向外。如果较小,则指向内部。如果你有一个完美的球体并指向质心,它应该几乎为零。一般曲面可能不是这样,但曲面的凸度应确保足以检查其方向

if(dist_centroid < dist_with_normal):
    n *= -1
if(dist\u形心

另一个更好的选择是使用标量积

pmid = (p1 + p2 + p3) / 3
if(np.dot(pmid - centroid, n) < 0):
    n *= -1
pmid=(p1+p2+p3)/3
如果(np.dot(pmid-质心,n)<0):
n*=-1
这将检查法线和从三角形中点到质心的向量是否具有相同的方向。如果不是这样,请改变方向

if(dist_centroid < dist_with_normal):
    n *= -1