Math fails in R12, worked previously



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 04/09/2010 at 11:36, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   R12 
    Platform:   Windows  ;   Mac OSX  ; 
    Language(s) :     C++  ;

    ---------
    "Process.RayTriangleIntersect.I is outside T.a"

    The following method is returning this error (near end of method) in Cinema 4D R12.  It works perfectly in R9.1->R11.5.  No idea what to do.  I shouldn't be changing MY working algorithms for new builds!

    // Process.RayTriangleIntersect  
    //*---------------------------------------------------------------------------*  
    Bool Process::RayTriangleIntersect(const Vector& p0, const Vector& p1, const Vector& lv0, const Vector& lv1, const Vector& lv2)  
    //*---------------------------------------------------------------------------*  
    {  
      // get triangle edge vectors and plane normal  
      Vector    u =        lv1 - lv0;  
      Vector    v =        lv2 - lv0;  
      Vector    n =        u % v;                    // cross product  
      // triangle is degenerate  
      if (n == (Vector)0)  
      {  
          GePrint("Process.RayTriangleIntersect.Degenerate Triangle");  
          return FALSE;                    // do not deal with this case  
      }  
      
      // ray vectors  
      // params to calc ray-plane intersect  
      Vector    dir =    p1 - p0;                // ray direction vector  
      Real    b =        n * dir;  
      // ray is parallel to triangle plane  
      if (Abs(b) < 0.00000001)  
      {  
          // ray lies in triangle plane  
          //if (a == 0)    return FALSE;  
          // ray disjoint from plane  
          GePrint("Process.RayTriangleIntersect.Ray Parallel Triangle Plane");  
          return FALSE;  
      }  
      Real    a =        -(n * (p0 - lv0));  
      
      // get intersect point of ray with triangle plane  
      Real    r =        a / b;  
      // ray goes away from triangle  
      if (r < 0.0)  
      {  
          GePrint("Process.RayTriangleIntersect.No Intersect");  
          return FALSE;                    // => no intersect  
      }  
      // for a segment, also test if (r > 1.0) => no intersect  
      
      // intersect point of ray and plane  
      hitpos =        p0 + r * dir;  
      
      // is I inside T?  
      n =                hitpos - lv0;  
      Vector    wu =    n * u;  
      Vector    wv =    n * v;  
      n =                u * v;  
      u =                u * u;  
      v =                v * v;  
      Real    D =        1.0 / (n * n - u * v);  
      
      // get and test parametric coords  
      a =                (n * wv - v * wu) * D;  
      // I is outside T  
      if ((a < 0.0) || (a > 1.0))  
      {  
          GePrint("Process.RayTriangleIntersect.I is outside T.a");  
          return FALSE;  
      }  
      b =                (n * wu - u * wv) * D;  
      // I is outside T  
      if ((b < 0.0) || ((a + b) > 1.0))  
      {  
          GePrint("Process.RayTriangleIntersect.I is outside T.b");  
          return FALSE;  
      }  
      
      // I is in T  
      return TRUE;  
    }
    


  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 04/09/2010 at 13:07, xxxxxxxx wrote:

    Found it!  Seems that initializing to MAXREAL and MINREAL(either of the new variations) isn't working so I just made new constants BIGPOSREAL and BIGNEGREAL of sufficient size. :)



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/09/2010 at 01:40, xxxxxxxx wrote:

    Hm... I also ue MAXREAL in some of my code, and it still works.
    Should be investigated. Is MAXREAL correctly defined? Which value does your variable have after initialization? If it's different from the original MAXREAL value, there might be some evil compiler optimization going on.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/09/2010 at 06:08, xxxxxxxx wrote:

    How?  MAXREAL and MINREAL are no longer defined in R12.  They are now MAXREALs, MAXREALr, MAXREALl, ...  Still, since Real is now defined as LReal, I redefined MAXREAL = MAXREALl, MINREAL = MINREALl.  This causes problems unlike when Real = float and MAXREAL = maximum float.  My defines work well though. :)


Log in to reply