2017-10-29 5 views
0

Ich versuche ray-Dreieck Kreuzung Test zu tun, wie es am https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ray-triangle-intersection-geometric-solutionRay-Dreieck Kreuzung negatives Ergebnis

denke getan wird Ich alles funktioniert, außer, dass ich an Wert bekommen, die das Gegenteil von was ich erwarte. Zum Beispiel, wenn I ein Dreieck mit den Eckpunkten v0 test [-1, -1, -10], V1 [1, -1, -10], V2 [0, 1, -10], und der Punkt (p) [0, 0,0] und Richtungsvektor (d) [0, 0, -1], ich bin einen Wert von -10 statt 10 für t bekommen.

Also wenn ich löse mit t, um den Schnittpunkt zu bekommen, der Z-Wert ist immer umgedreht, ich war nicht sicher, ob dies etwas mit dem Koordinatensystem in opengl zu tun hatte oder wenn ich irgendwo einen Fehler in meinem Code habe ?? Ich ging meinen Code ziemlich gründlich über, um sicherzustellen, war ich die Makro-Operationen wie Vektor tut, Kreuzprodukt, innerProduct usw. die gleichen wie sie es auf der Website tun, und ich kann nicht herausfinden, was sonst könnte falsch sein!

Diese Java-Code ist, ich glaube, ich war nur eine Erklärung zu bekommen hofft, warum mein t falschem Vorzeichen ist, bevor ich nur ein negatives Vorzeichen meinen Berechnungen hinzuzufügen!

public static boolean RayTriangleIntersectionTest(Vector3f p, Vector3f d, Vector3f v0, Vector3f v1, Vector3f v2) 
     { 
      Vector3f e1 = VectorFromPoints(v0, v1); 
      Vector3f e2 = VectorFromPoints(v0, v2); 

      Vector3f h = CrossProduct(d, e2); 
      double a = DotProduct(e1, h); 

      if (a > -0.00001 && a < 0.00001) 
       return false; 

      double f = 1.0/a; 

      Vector3f s = VectorFromPoints(v0, p); 
      double u = f * DotProduct(s, h); 

      if (u < 0.0 || u > 1.0) 
       return (false); 

      Vector3f q = CrossProduct(s, e1); 
      double v = f * DotProduct(p, q); 

      if (v < 0.0 || u + v > 1.0) 
       return (false); 

      // at this stage we can compute t to find out where the intersection point is on the line 
      double t = f * DotProduct(e2, q); 

      if (t > 0.00001) // ray intersection 
       return (true); 
      else // line intersection but not a ray intersection 
       return (false); 
     } 

public static Vector3d CrossProduct(Vector3f v0, Vector3f v1) 
     { 
      Vector3f Vout = new Vector3f(); 

      Vout.x = v1.y * v0.z - v0.y * v1.z; 
      Vout.y = v1.x * v0.z - v0.x * v1.z; 
      Vout.z = v1.x * v0.y - v0.x * v1.y; 

      return Vout; 
     } 

     public static double DotProduct(Vector3f v0, Vector3f v1) 
     { 
      return v0.x * v1.x + v0.y * v1.y + v0.z * v1.z; 
     } 

     public static Vector3d VectorFromPoints(Vector3f v0, Vector3f v1) 
     { 
      return new Vector3f(v1.x - v0.x, v1.y - v0.y, v1.z - v0.z); 
     } 
+0

Bitte spam keine Tags. – George

Antwort

0

Sie sollten Ihre CrossProduct() - Methode überarbeiten. Es tauscht manchmal v0 und v1. Eine korrekte Version wäre:

Vout.x = v1.z * v0.y - v0.z * v1.y; 
Vout.y = v1.x * v0.z - v0.x * v1.z; 
Vout.z = v1.y * v0.x - v0.y * v1.x;