2017-02-23 40 views
0

C#で2つのモデル間でブール減算を行う必要があります。メッシュの1つは完全に他のメッシュ内にあるので、私は1つのモデルの法線を逆にして2つのモデルを一緒に追加することを望んでいました。私は法線を逆転させる方法を失っている。C#の反転面法線

これは私が通常の表面を計算しています方法です:

//creates surface normals 
    Vector3D CalculateSurfaceNormal(Point3D p1, Point3D p2, Point3D p3) 
    { 
     Vector3D v1 = new Vector3D(0, 0, 0);    // Vector 1 (x,y,z) & Vector 2 (x,y,z) 
     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; 
    } 

を私はそれを否定することで、通常のを逆に助言された。私は値が否定されて見つける

n = CalculateSurfaceNormal(p1, p2, p3); 
n = new Vector3D(-1 * n.X, -1 * n.Y, -1 * n.Z); 

、しかし、ときに私3Dプログラムでモデルを表示すると、モデルに変更はありません。

もう1つの提案は、ベクトルの順序を変更してバックカリングを試みることでした。私はv1とv2の順序を入れ替えることでこれを試しました。

モデルに変更はありません。ここで

は、全体のコードです:

private void SaveMoldMeshtoStlFile(MeshGeometry3D mesh, string filename) 
    { 
     if (mesh == null) 
      return; 

     if (File.Exists(filename)) 
     { 
      File.SetAttributes(filename, FileAttributes.Normal); 
      File.Delete(filename); 
     } 

     Point3DCollection vertexes = mesh.Positions; 
     Int32Collection indexes = mesh.TriangleIndices; 

     Point3D p1, p2, p3; 
     Vector3D n; 

     string text; 

     using (TextWriter writer = new StreamWriter(filename)) 
     { 
      writer.WriteLine("solid Bolus"); 

      for (int v = 0; v < mesh.TriangleIndices.Count(); v += 3) 
      { 
       //gather the 3 points for the face and the normal 
       p1 = vertexes[indexes[v]]; 
       p2 = vertexes[indexes[v + 1]]; 
       p3 = vertexes[indexes[v + 2]]; 
       n = CalculateInvertedSurfaceNormal(p1, p2, p3); 

       text = string.Format("facet normal {0} {1} {2}", n.X,n.Y, n.Z); 
       writer.WriteLine(text); 
       writer.WriteLine("outer loop"); 
       text = String.Format("vertex {0} {1} {2}", p1.X, p1.Y, p1.Z); 
       writer.WriteLine(text); 
       text = String.Format("vertex {0} {1} {2}", p2.X, p2.Y, p2.Z); 
       writer.WriteLine(text); 
       text = String.Format("vertex {0} {1} {2}", p3.X, p3.Y, p3.Z); 
       writer.WriteLine(text); 
       writer.WriteLine("endloop"); 
       writer.WriteLine("endfacet"); 

      } 


     } 
    } 

    //creates inverted surface normals 
    Vector3D CalculateInvertedSurfaceNormal(Point3D p1, Point3D p2, Point3D p3) 
    { 
     Vector3D v1 = new Vector3D(0, 0, 0);    // Vector 1 (x,y,z) & Vector 2 (x,y,z) 
     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 
     v2.X = p1.X - p2.X; 
     v2.Y = p1.Y - p2.Y; 
     v2.Z = p1.Z - p2.Z; 
     // Calculate The Vector From Point 3 To Point 2 
     v1.X = p2.X - p3.X; 
     v1.Y = p2.Y - p3.Y; 
     v1.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; 
    } 

は私のコードでエラーがありますか?何か不足していますか?私はいくつかの異なるプログラムで輸出されたモデルを試しましたが、輸出されたモデルには依然として外向きの法線があります。 Blenderで法線を反転させてみたところ、他のプログラムでも法線が反転していることがわかったので、私のプログラムではそれが問題であると確信しています。

答えて

0

解決策を解説しました。

各三角形の点の順番は重要です。ポイントの順序が法線の方向をサポートしていない場合、他のプログラムが自動的に法線を修正することを発見しています。私はこれを持っていた

:私の問題を解決し

//gather the 3 points for the face and the normal 
      p3 = vertexes[indexes[v]]; 
      p2 = vertexes[indexes[v + 1]]; 
      p1 = vertexes[indexes[v + 2]]; 
      n = CalculateInvertedSurfaceNormal(p1, p2, p3); 

//gather the 3 points for the face and the normal 
      p1 = vertexes[indexes[v]]; 
      p2 = vertexes[indexes[v + 1]]; 
      p3 = vertexes[indexes[v + 2]]; 
      n = CalculateInvertedSurfaceNormal(p1, p2, p3); 

は私の代わりにこれを変更することによってポイントの方向を逆転させました。