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

    Object boundries.

    Scheduled Pinned Locked Moved SDK Help
    14 Posts 0 Posters 1.0k 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 19/05/2010 at 10:03, xxxxxxxx wrote:

      Hey Robert,

      Is this the type of thing I should be looking for?

      http://wiki.cgsociety.org/index.php?title=Ray_Triangle_Intersection&redirect=no

      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 19/05/2010 at 11:56, xxxxxxxx wrote:

        Optimized code is faster. 🙂

        ////////////////////////////////////////////////////////////////  
        // DIRayCollider.h  
        ////////////////////////////////////////////////////////////////  
        // Drop It! Pro Ray-TrianglularMesh Intersection Class include  
        ////////////////////////////////////////////////////////////////  
        // V0.8 2006.01.03 Robert Templeton  
        ////////////////////////////////////////////////////////////////  
        #ifndef _DIRAYCOLLIDER_H_  
        #define _DIRAYCOLLIDER_H_  
          
        // CLASS: DIRayCollider  
        class DIRayCollider  
        {  
          private:  
              Vector*            points;  
              CPolygon*        poly;  
              CPolygon*        lastPoly;  
              Matrix            gmat;  
              LVector            hitpos;  
              // Triangle  
              Vector            v0;  
              Vector            v1;  
              Vector            v2;  
              // Ray  
              LVector            p0;  
              LVector            p1;  
          public:  
              DIRayCollider();  
              ~DIRayCollider();  
              void    Init(BaseObject* goal);  
              Bool    Intersect(const Vector& ray_p0, const Vector& ray_p1, Real* distance);  
              //Bool    IntersectNearPoint(const Vector& ray_p0, const Vector& ray_p1, Vector* point);  
              //Bool    IntersectFarPoint(const Vector& ray_p0, const Vector& ray_p1, Vector* point);  
              CHAR    intersect_RayTriangle(const LVector& lv0, const LVector& lv1, const LVector& lv2);  
              static    DIRayCollider* Alloc();  
              static    void Free(DIRayCollider*& data);  
        };  
          
        #endif //_DIRAYCOLLIDER_H_
        
        ////////////////////////////////////////////////////////////////  
        // DIRayCollider.cpp  
        ////////////////////////////////////////////////////////////////  
        // Drop It! Pro Ray-TriangularMesh Intersection Class include  
        ////////////////////////////////////////////////////////////////  
        // V0.8 2006.01.03 Robert Templeton  
        ////////////////////////////////////////////////////////////////  
          
        // Includes  
        #include "general.h"  
        #include "DIRayCollider.h"  
          
        // METHODS: DIRayCollider ==================================================================================================  
        // Constructor  
        //*---------------------------------------------------------------------------*  
        DIRayCollider::DIRayCollider()  
        //*---------------------------------------------------------------------------*  
        {  
        }  
        // Destructor  
        //*---------------------------------------------------------------------------*  
        DIRayCollider::~DIRayCollider()  
        //*---------------------------------------------------------------------------*  
        {  
        }  
        // DIRayCollider.Init  
        //*---------------------------------------------------------------------------*  
        void DIRayCollider::Init(BaseObject* goal)  
        //*---------------------------------------------------------------------------*  
        {  
          PolygonObject*    pobj =    (PolygonObject* )goal;  
        #ifdef    C4D_R11  
          points =    pobj->GetPointW();  
          poly =        pobj->GetPolygonW();  
        #else  
          points =    pobj->GetPoint();  
          poly =        pobj->GetPolygon();  
        #endif  
          lastPoly =    poly + pobj->GetPolygonCount();  
          gmat =        pobj->GetMg();  
        }  
        // DIRayCollider.Intersect  
        // - Returns the nearest distance intersection  
        //*---------------------------------------------------------------------------*  
        Bool DIRayCollider::Intersect(const Vector& ray_p0, const Vector& ray_p1, Real* distance)  
        //*---------------------------------------------------------------------------*  
        {  
          p0 =            LVector(ray_p0.x, ray_p0.y, ray_p0.z);  
          p1 =            LVector(ray_p1.x, ray_p1.y, ray_p1.z);  
          *distance =        MAXREAL;  
          
          UCHAR            res;  
          Bool            intersection =    FALSE;  
          Real            dist;  
          
          // Get intersections, if any, and retain nearest  
          for (CPolygon* p = poly; p != lastPoly; ++p)  
          {  
              v0 =    gmat*points[p->a];  
              v1 =    gmat*points[p->b];  
              v2 =    gmat*points[p->c];  
              res =    intersect_RayTriangle(LVector(v0.x, v0.y, v0.z), LVector(v1.x, v1.y, v1.z), LVector(v2.x, v2.y, v2.z));  
              if (res < 1)    continue;  
              if (res == 1)  
              {  
                  intersection =    TRUE;  
                  dist =            LDistance(p0, hitpos);  
                  if (dist < *distance) *distance = dist;  
              }  
              else if    (res == 2)  
              {  
                  *distance =    0.0f;  
                  return TRUE;  
              }  
          }  
          return intersection;  
        }  
        // DIRayCollider.Intersect  
        // anything that avoids division overflow  
        #define SMALL_NUM    0.00000001f  
        //*---------------------------------------------------------------------------*  
        CHAR DIRayCollider::intersect_RayTriangle(const LVector& lv0, const LVector& lv1, const LVector& lv2)  
        //*---------------------------------------------------------------------------*  
        {  
          LVector    u, v, n;                // triangle vectors  
          // get triangle edge vectors and plane normal  
          u =        lv1 - lv0;  
          v =        lv2 - lv0;  
          n =        u % v;                    // cross product  
          // triangle is degenerate  
          if (n == (LVector)0)  
              return -1;                    // do not deal with this case  
          
          LVector    dir, w0;                // ray vectors  
          dir =    p1 - p0;                // ray direction vector  
          w0 =    p0 - lv0;  
          LReal    a, b;                    // params to calc ray-plane intersect  
          a =        -(n * w0);  
          b =        n * dir;  
          // ray is parallel to triangle plane  
          if (fabs(b) < SMALL_NUM)  
          {  
              // ray lies in triangle plane  
              if (a == 0)    return 2;  
              // ray disjoint from plane  
              else        return 0;  
          }  
          
          // get intersect point of ray with triangle plane  
          LReal    r;  
          r = a / b;  
          // ray goes away from triangle  
          if (r < 0.0)    return 0;                    // => 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?  
          LVector    w;  
          LReal    uu, uv, vv, wu, wv, D;  
          uu = u * u;  
          uv = u * v;  
          vv = v * v;  
          w = hitpos - lv0;  
          wu = w * u;  
          wv = w * v;  
          D = 1.0 / (uv * uv - uu * vv);  
          
          // get and test parametric coords  
          a = (uv * wv - vv * wu) * D;  
          // I is outside T  
          if ((a < 0.0) || (a > 1.0))            return 0;  
          b = (uv * wu - uu * wv) * D;  
          // I is outside T  
          if ((b < 0.0) || ((a + b) > 1.0))    return 0;  
          
          // I is in T  
          return 1;  
        }  
          
        // Static Allocator  
        //*---------------------------------------------------------------------------*  
        DIRayCollider* DIRayCollider::Alloc()  
        //*---------------------------------------------------------------------------*  
        {  
          return gNew DIRayCollider;  
        }  
        // Static Deallocator  
        //*---------------------------------------------------------------------------*  
        void DIRayCollider::Free(DIRayCollider*& data)  
        //*---------------------------------------------------------------------------*  
        {  
          gDelete(data);  
        }  
        
        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 19/05/2010 at 12:04, xxxxxxxx wrote:

          awesome..  you are the man.  🙂   Thanks again.

          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 19/05/2010 at 16:13, xxxxxxxx wrote:

            Hey Robert,  I am trying to build an example based on the code you provided.  All is going well except I notice you include "general.h" in your code.

            I am assuming that in the line:

            dist =            LDistance(p0, hitpos);

            LDistance is defined in general.h?

            would you mind telling me what LDistance is defined as?

            Can this be replaced with Len(p-p)?

            Thanks a lot.

            ~Shawn

            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 19/05/2010 at 16:58, xxxxxxxx wrote:

              Sorry about that.  It is just a 3D point-point distance calculation:

              // Return Real distance between two LVectors  
              //*---------------------------------------------------------------------------*  
              Real LDistance(LVector v1, LVector v2)  
              //*---------------------------------------------------------------------------*  
              {  
                Real    x;  
                Real    y;  
                Real    z;  
                x =        v2.x - v1.x;  
                y =        v2.y - v1.y;  
                z =        v2.z - v1.z;  
                return (Real)Sqrt((x*x) + (y*y) + (z*z));  
              }
              
              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 19/05/2010 at 17:07, xxxxxxxx wrote:

                So if I want to check if a point has intersected with the triangle I call intersect_RayTriangle

                and pass it the points of the triangle in question?

                ~Shawn

                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 19/05/2010 at 17:31, xxxxxxxx wrote:

                  My routines are set to be initiated with a polygon object to test against but you can certainly alter it to take a point instead.  In your case, I'd alter it to take the point and send the polygon object's triangles one at a time in which you want to test.  Lemme see if I can attach the appropriate source file to a message. 🙂

                  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 19/05/2010 at 17:45, xxxxxxxx wrote:

                    Great.. that will help a lot.  Thanks again Robert.

                    ~Shawn

                    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 19/05/2010 at 17:54, xxxxxxxx wrote:

                      I have one more question.   
                      So the first step is to call init(MyObjectThatThepoint will collide with)?

                      Then I want to call Intersection () and pass it the point and the vector that determines the ray,   what is the distance variable?

                      and by calling Intersection,   that then calls intersect_RayTriangle to see if the intersection has happened?
                       and then returns the bool as to whether it has happened or not?

                      thanks,

                      Shawn

                      so that intersection can then call

                      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 19/05/2010 at 19:06, xxxxxxxx wrote:

                        Yes.
                        Yes.
                        Distance is what is returned.  In my case, I'm seeking intersection of two objects so the distance counts.  In your case, you should be looking to see whether 'penetration' exists - the point is inside the object.
                        Yes.
                        Yes.

                        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 19/05/2010 at 19:16, xxxxxxxx wrote:

                          lol.. thanks.. I guess 1 question turned in to 5..  HAHA

                          ~Shawn

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