Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Math fails in R12, worked previously

    Scheduled Pinned Locked Moved SDK Help
    4 Posts 0 Posters 286 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      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;  
      }
      
      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        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. 🙂

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          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.

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            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. 🙂

            1 Reply Last reply Reply Quote 0
            • First post
              Last post