2017-10-29 15 views
0

それは私がすべては私が反対である値で取得していますことを除いて、働いていると思いhttps://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ray-triangle-intersection-geometric-solutionレイ・トライアングル交差点否定結果

で行われているように私は光線 - 三角形の交差テストをやろうとしています私が期待しているもの。たとえば、頂点v0 [-1、-1、-10]、v1 [1、-1、-10]、v2 [0,1、-10]、およびポイント(p)[0、 0,0]、方向ベクトル(d)[0、0、-1]の場合、tは+10の代わりに-10の値を得ています。

私はtを使用して交差点を取得すると、z値は常に反転されますが、これはOpenGLの座標系と関係があるかどうか、私のコードのどこかにエラーがあるかどうかはわかりませんでした??私は自分のコードをかなり徹底的に調べて、ベクター、クロスプロダクト、innerProductなどのマクロ操作をサイトでやっているのと同じようにしていたのですが、他に何が間違っているのかわかりません!

これはJavaコードです。なぜ私の計算にマイナス記号を追加する前に私のtが間違っているのかを説明したいと思っていました。

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

タグをスパムしないでください。 – George

答えて

0

CrossProduct()メソッドを再作成する必要があります。 v0とv1を時々交換します。 正しいバージョンは次のようになります。

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;