【问题标题】:orientation of normal surface/vertex vectors法线表面/顶点向量的方向
【发布时间】:2016-02-18 19:56:01
【问题描述】:

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

【问题讨论】:

    标签: numpy vector-graphics normals


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2016-07-13
      相关资源
      最近更新 更多