Maxon Developers
    • Downloads
      • All Downloads
      • Cinema 4D Python SDK
      • Cinema 4D C++ SDK
      • Cineware SDK
      • ZBrush GoZ SDK
      • Cinema 4D Python Examples
      • Cinema 4D C++ Examples
      • Project Tool
      • SDK Database
    • Documentation
      • Cinema 4D Python SDK
      • Cinema 4D C++ SDK
      • Cineware SDK
      • ZBrush GoZ SDK
    • Forum
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Forums
      • Overview
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • News & Information
      • Downloads
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Register
    • Login

    GeRayCollider problem in Perspective view

    SDK Help
    0
    4
    73
    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
      Helper
      last edited by

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

      On 21/10/2005 at 18:39, xxxxxxxx wrote:

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

      ---------
      Howdy,

      I have a problem with my tool plugin and the GeRayCollider in the perspective view. It's not detecting a collision when one part of the mesh is behind another part if there is a lot of distance between the parts.

      When the foot is below the hand in the perspective view it picks up points of the foot:

      But when the the polygons of the foot are moved closer to the hand then it is detecting a collision.

      It works fine in the Top View no matter how much distance is between the hand and foot:

      Here is the code:

        
      Bool TestTool::MouseInput(BaseDocument *doc, BaseContainer &data;, BaseDraw *bd,EditorWindow *win, const BaseContainer &msg;)  
      {  
           opActive = doc->GetActiveObject(); if(!opActive) return TRUE;  
        
           Vector     rayEnd, rayStart, opt, mpt, *padr = ToPoint(opActive)->GetPoint();  
           LONG     index, ptCount = ToPoint(opActive)->GetPointCount();  
           Matrix     rayMatrix;  
        
           mx = msg.GetReal(BFM_INPUT_X);  
           my = msg.GetReal(BFM_INPUT_Y);  
           LONG button;  
             
           switch (msg.GetLong(BFM_INPUT_CHANNEL))  
           {  
                case BFM_INPUT_MOUSELEFT : button=KEY_MLEFT; break;  
                case BFM_INPUT_MOUSERIGHT: button=KEY_MRIGHT; break;  
                default: return TRUE;  
           }  
             
           AutoAlloc<GeRayCollider> rc;  
           if (!rc) return FALSE;  
           rc->Init(opActive, TRUE);  
        
           Real     dx, dy, rad=data.GetReal(1000);  
           mDrag = FALSE;  
           BaseContainer bc, device;  
           BaseSelect *bs = ToPoint(opActive)->GetPointS(); if (!bs) return TRUE;  
           win->MouseDragStart(button,mx,my,MOUSEDRAG_DONTHIDEMOUSE|MOUSEDRAG_NOMOVE);  
           while (win->MouseDrag(&dx;,&dy;,&device;)==MOUSEDRAG_CONTINUE)  
           {  
                mx+=dx;  
                my+=dy;  
                mDrag = TRUE;  
                for(index=0; index<ptCount; index++)  
                {  
                     opt = bd->WS(opActive->GetMg() * padr[index]);  
                     opt.z = 0.0;  
                     mpt.x = mx;  
                     mpt.y = my;  
                     mpt.z = 0.0;  
                     if(Len(opt - mpt) < rad)  
                     {  
                          if(data.GetBool(1001))  
                          {  
                               rayEnd = bd->SW(Vector(mx,my,0));  
                               rayStart = bd->SW(Vector(mx,my,10000.0));  
                               rayDir = !opActive->GetMg() * (rayEnd - rayStart);  
                               rayPt = padr[index] + !rayDir*0.1;  
                               if(!rc->Intersect(rayPt, !rayDir, 10000.0))  
                               {  
                                    bs->Select(index);  
                               }  
                          }  
                          else  
                          {  
                               bs->Select(index);  
                          }  
                     }  
                }  
                DrawViews(DA_ONLY_ACTIVE_VIEW|DA_NO_THREAD|DA_NO_ANIMATION);  
           }  
           mDrag = FALSE;  
           DrawViews(DA_ONLY_ACTIVE_VIEW|DA_NO_THREAD|DA_NO_ANIMATION);  
        
           return TRUE;  
      }
      

      I'm not sure exactly what's wrong. Any ideas?

      Adios,
      Cactus Dan

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

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

        On 22/10/2005 at 01:30, xxxxxxxx wrote:

        the ray direction should be transformed like
        rayDir = !mg ^ ( rayEnd - rayStart )
        this omits the translation part.

        This could be the problem.. otherwise it looks fine to me.

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

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

          On 22/10/2005 at 08:10, xxxxxxxx wrote:

          Howdy,

          Hmmm, It's still not working right. I changed the line to this:
          rayDir = (rayEnd - rayStart) ^ !opActive->GetMg();
          because CodeWarrior gave me an error with the matrix on the left side of the XOR operator.

          But I did notice the radius setting of the tool makes a difference. If I set the radius of the tool to 5 or less there's no problem. The higher I set the radius the more points from underneath are selected:

          I wonder if it's because the rays are being shot from the point but parallel to the ray shot from (mx, my, 10000) to (mx, my, 0), and it's missing the collision. Maybe it would be better to shoot the ray from the point to the (mx, my, 0) instead of shooting the ray from (mx, my, 10000) to (mx, my, 0)?

          I'll see if that works.

          Adios,
          Cactus Dan

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

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

            On 22/10/2005 at 08:26, xxxxxxxx wrote:

            Howdy,

            AHA!!!! That's it! That was the problem. The ray was being shot parallel to the ray shot from the mouses position. I changed these lines:

            rayEnd = bd->SW(Vector(mx,my,0));
            rayStart = bd->SW(Vector(mx,my,10000.0));

            to this:

            rayEnd = bd->SW(opt);
            rayStart = opActive->GetMg() * padr[index];

            Now the ray is being shot from the point's world position to the point's screen position, and it works beautifully!

            Adios,
            Cactus Dan

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