C#Calucate曲面法线反而不是布尔减法

时间:2017-02-23 17:11:43

标签: c# mesh

我需要在C#中的两个模型之间进行布尔减法。其中一个网格将完全位于其他网格中,因此我希望反转一个模型的法线并将两个模型加在一起。我对如何扭转法线感到茫然。

这就是我计算表面法线的方法:

//creates surface normals
    Vector3D CalculateSurfaceNormal(Point3D p1, Point3D p2, Point3D p3)
    {
        Vector3D v1 = new Vector3D(0, 0, 0);             
        Vector3D v2 = new Vector3D(0, 0, 0);
        Vector3D normal = new Vector3D(0, 0, 0);

        // Finds The Vector Between 2 Points By Subtracting
        // The x,y,z Coordinates From One Point To Another.

        // Calculate The Vector From Point 2 To Point 1
        v1.X = p1.X - p2.X;                  
        v1.Y = p1.Y - p2.Y;                  
        v1.Z = p1.Z - p2.Z;                  
        // Calculate The Vector From Point 3 To Point 2
        v2.X = p2.X - p3.X;                  
        v2.Y = p2.Y - p3.Y;                  
        v2.Z = p2.Z - p3.Z;                  

        // Compute The Cross Product To Give Us A Surface Normal
        normal.X = v1.Y * v2.Z - v1.Z * v2.Y;   // Cross Product For Y - Z
        normal.Y = v1.Z * v2.X - v1.X * v2.Z;   // Cross Product For X - Z
        normal.Z = v1.X * v2.Y - v1.Y * v2.X;   // Cross Product For X - Y

        normal.Normalize();

        return normal;
    }

是否有一种简单的方法来反转曲面法线?

1 个答案:

答案 0 :(得分:1)

翻转正常只是否定它(即通过否定每个组件)。这将颠倒它指向的方向。

normal.X = -normal.X
normal.Y = -normal.Y
normal.Z = -normal.Z

矢量类型可能会有一个重载的一元否定运算符,所以如果你有这个,你可以做到这一点

normal = -normal

如果您处于背面剔除的环境中,您将需要反转每个三角形顶点的缠绕(这将自然地翻转所得到的计算法线)。要做到这一点,只需翻转三角形的任意两个顶点的顺序。