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

    Collision within a Radius

    Scheduled Pinned Locked Moved SDK Help
    17 Posts 0 Posters 1.2k 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 07/04/2011 at 03:57, xxxxxxxx wrote:

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

      ---------
      Hi everyone.

      I am using teh following code to detect for collisions with the mouse and objects behind it.  If it is true, the object in my plugin highlights to show that the mouse is over that part of the tool.  The problem is that this limits the user to only being able to select the tool if the mouse is exactly over the handles which are drawn with DrawPolygonObject().

      Using this method for detecting if the mouse is over the tool is fine but I would like to be able to set a radius for the tool and if the tool is within that radius it is also selected.  Does anyone know how I coiuld acheive this while incorporating the code below.   🙂

      Thanks,

      Shawn

        
      //CHECK FOR COLLISIONS  
      //=============================================//  
      Bool UniversalManipulator::IsCollision(PolygonObject *pObj, BaseDraw *bd){  
        
        AutoAlloc<GeRayCollider> cRay;  
        if (!cRay) return FALSE;  
        
        GeRayColResult res;  
        
        Real x = cursorX;  
        Real y = cursorY;  
        
        // Make sure RayCollider is there  
        if (!cRay)  
        {  
            GePrint("ERROR - RayCollider not Initialized");  
            return FALSE;  
        }  
        
        Vector wtail =    bd->SW(Vector(x, y, 0));  
        Vector whead =    bd->SW(Vector(x, y, 1000000));  
        Vector otail = (!pObj->GetMg()) * wtail;  
        Vector oray     = (whead - wtail) ^ (!pObj->GetMg());  
        
        
        cRay->Init(pObj, TRUE);  
        cRay->Intersect(otail, !oray, 1000000.0);  
        
        
        if (cRay->GetNearestIntersection(&res))  
        {  
            //GePrint("A COLLISION HAS OCCURED");  
            return TRUE;  
        }  
        
        return FALSE;  
      }  
      
      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 07/04/2011 at 05:24, xxxxxxxx wrote:

        Hey Shawn,

        What is, if you do more intersections like:

        wtail1 =    bd->SW(Vector(x, y, 0));  
        wtail2 =    bd->SW(Vector(x+1, y+1, 0));  
        wtail3 =    bd->SW(Vector(x+1, y, 0));  
        wtail4 =    bd->SW(Vector(x-1, y, 0));
        

        And so one. 😉 Use the http://en.wikipedia.org/wiki/Unit_circle for more points and maybe a loop between the circle. 😉

        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 07/04/2011 at 08:14, xxxxxxxx wrote:

          You cold try using PointLineDistance instead. If the distance from the handle to the ray is less than the desired radius, you have a hit.

          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 07/04/2011 at 09:35, xxxxxxxx wrote:

            So if I wanted to use PointLineDistance()...
             
            Would it be like this?
             
             
            PointLineDistance(wtail, whead, res.hitpos);
             
            Also, is the Vector that is returned by this function the distance fromt the point to the ray?

            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 07/04/2011 at 09:44, xxxxxxxx wrote:

              Or would I instead do:
               
              PointLineDistance(wtail, oray, res.hitpos);

              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 07/04/2011 at 13:32, xxxxxxxx wrote:

                okay using the last code i posted the res.hitpos always returns 0,0,0

                Anyone have any idea why?

                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 07/04/2011 at 14:52, xxxxxxxx wrote:

                  (0,0,0) is correct.

                  Because you calculate the distance between your 'intersection line' and a hit point of the intersection.

                  A Point at a line = distance = 0. 😉

                  You should do it maybe with points of a polygon near the hit point.

                  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 07/04/2011 at 16:16, xxxxxxxx wrote:

                    Like this?

                    Vector distance = PointLineDistance(wtail, oray, pObj->GetMg().off);

                    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 07/04/2011 at 16:25, xxxxxxxx wrote:

                      How does the vector returned by PointLineDistance() represent the distance,,,  what does each Real in the Vector represent?

                      for example   when I use the above line I get a bunch of different numbers and those numbers do not seem to be the same when the camera is in different places..

                      Hopefully that makes sense..  lol

                      ~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 07/04/2011 at 16:44, xxxxxxxx wrote:

                        The ray should be in the same space as the object and the shortest distance is the length of the returned vector.

                        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 07/04/2011 at 17:27, xxxxxxxx wrote:

                          okay I've got it work using

                            
                            
                          Vector distance = PointLineDistance(wtail, whead, pObj->GetMg().off);  
                            Real disX = distance.x;  
                            Real disY = distance.y;  
                            Real disZ = distance.z;  
                            
                            //if (cRay->GetNearestIntersection(&res))  
                            if((disX > -20 && disX < 20) && (disY > -20 && disY < 20) && (disZ > -20 && disZ < 20))    
                            {  
                                //GePrint("A COLLISION HAS OCCURRED");  
                                return TRUE;  
                            }  
                            
                          

                          now in order to make this whole thing work the right way I need to be able to capture the initial mouse location when the mouse is clicked and dragged and then not get the mouse location while it is dragging..   So basically I want the mouse location where the user clicks but then I don't want the location while the mouse is dragging.

                          Is this possible...  I currently use BFM_INPUT_X & BFM_INPUT_Y  to get the mouse location but this value changes as the mouse is dragging.

                          Thanks,

                          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 07/04/2011 at 18:24, xxxxxxxx wrote:

                            Just use GetLength(), e.g.

                            const Real threshold = 10.0;   
                            Real dist = result.GetLength();   
                            if(dist <= threshold) 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 07/04/2011 at 18:35, xxxxxxxx wrote:

                              Thank you David that is much cleaner..  🙂

                                
                                Vector distance = PointLineDistance(wtail, whead, pObj->GetMg().off);  
                                const Real threshold = 20.0;  
                                Real dist = distance.GetLength();  
                                  
                                if(dist <= threshold)    
                                {  
                                    //GePrint("A COLLISION HAS OCCURED");  
                                    return TRUE;  
                                }  
                              

                              Anyone know about getting the mouse position of the initial click when doing a mouse drag?

                              Thanks,

                              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 07/04/2011 at 23:12, xxxxxxxx wrote:

                                Hello,
                                a question where you perform this?
                                if you hare in mouse input you can use ViewPortSelect::PickObject()
                                this will fill a c4dobjectlist with all obj in the radius in z order.
                                it will have not very good performance but can solve the situation.

                                try it

                                all the best
                                Franz

                                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 08/04/2011 at 02:50, xxxxxxxx wrote:

                                  Hi Franz.   Thanks,   I am able to select within a set radius now.  See the last code I posted.  Now I am trying to figure out how to capture the screen coordinates of the first initial mouse click when the user drags the mouse.  I do not want to keep storing the mouse position after that first click so I need to figure out how to store only that first click.  🙂

                                  Thanks,

                                  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 08/04/2011 at 07:40, xxxxxxxx wrote:

                                    This is from the liquid draw example in the SDK.
                                    Seems to work.

                                    Real mx = msg.GetReal(BFM_INPUT_X);  
                                    Real my = msg.GetReal(BFM_INPUT_Y);  
                                    GePrint(RealToString(mx));  
                                    GePrint(RealToString(my));  
                                    

                                    -ScottA

                                    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 08/04/2011 at 08:27, xxxxxxxx wrote:

                                      Howdy,

                                      Originally posted by xxxxxxxx

                                      ...Now I am trying to figure out how to capture the screen coordinates of the first initial mouse click when the user drags the mouse.  I do not want to keep storing the mouse position after that first click so I need to figure out how to store only that first click....

                                      If you store the mouse x and y in local variables startx and starty, and do that before the while loop, those variables won't change during the dragging.  😉

                                      Adios,
                                      Cactus Dan

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