2017-02-23 93 views
2

我需要在C#中的两个模型之间进行布尔相减。其中一个网格完全位于另一个网格内,所以我希望能够扭转一个模型的法线并将两个模型相加。尽管如此,我仍然对如何扭转常态产生了疑虑。C#Calucate曲面正常反而不是布尔减法

这是我如何计算的表面法线:

//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

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

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

矢量型可能将不得不为这个重载一元反运算符,所以如果你有,你可能能够做简单的

normal = -normal 

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

+0

谢谢,我会试试看。 –

+1

谢谢,这是颠倒了法线。这不是我想要的结果,但是我知道更多关于发生了什么事情后,我会发布另一个问题。 –