![]() |
Grabbing a random position on a rope at runtime (obirope 5) - Printable Version +- Obi Official Forum (https://obi.virtualmethodstudio.com/forum) +-- Forum: Obi Users Category (https://obi.virtualmethodstudio.com/forum/forum-1.html) +--- Forum: Obi Rope (https://obi.virtualmethodstudio.com/forum/forum-4.html) +--- Thread: Grabbing a random position on a rope at runtime (obirope 5) (/thread-2907.html) |
Grabbing a random position on a rope at runtime (obirope 5) - ink_13 - 03-05-2021 Hey, I've had a look over previous forum questions and have seen some answers that i think are related to an older system with pins... I have a rope that i'm at runtime I'm wanting to be able to grab... Previously it seemed like you would do this by creating a pin at the point where your hand touched the rope... My current approach is to try and find the closest particle to where your hand is, create a particle group at that point, and use a particle attachment to make a connection between that point and the transform of your hand. I'm abit stuck though, i can't figure out how to make a particle group at runtime, nor figure out how to specify the location of where the particle group should be. I have a convoluted idea that I could create a particle collision and see where the collision point is... Very curious if someone has a suggestion on if I'm approaching this in the right direction, and if i am - how to create a particle group at runtime at the point of collision... RE: Grabbing a random position on a rope at runtime (obirope 5) - josemendez - 03-05-2021 (03-05-2021, 06:16 AM)ink_13 Wrote: Hey, I've had a look over previous forum questions and have seen some answers that i think are related to an older system with pins... #1) you need to determine whether you need two-way coupling at all, or maybe one-way coupling is enough. That is, if the rope should be able to apply forces to the object it is attached to (two-way coupling) or not (one-way coupling). Two-way coupling is done by adding pin constraints, one-way coupling done by setting the particle mass to infinite and overriding its position. It has been this way since Obi 1.0. In newer versions, dynamic and static attachments (respectively) were added as a higher-level layer that automatically manage this for you. If all you want is to grab the rope and move it around, one-way coupling is enough. #2) you need to consider whether you want to keep track of the attached particles yourself, or if you want to delegate this task to attachments. When dealing with collisions and individual particles, working with particles directly is often easier since you don't have to create particle groups or attachments at all. So all you need to do is keep track of which particles are in contact with a collider, then set their inverse mass to zero (same as setting the mass to infinite, see: http://obi.virtualmethodstudio.com/tutorials/scriptingparticles.html), and set their position to whatever value you want while they're grabbed. To release them, just revert their inverse mass to whatever it was. Obi 6 includes a sample script (ObiCollisionGrabber) that does just this. See: Code: using UnityEngine; RE: Grabbing a random position on a rope at runtime (obirope 5) - ink_13 - 03-05-2021 Thanks very much for the advice - that was an incredibly detailed answer. I updated the program. Everything looks perfect and works well. Thanks so much! RE: Grabbing a random position on a rope at runtime (obirope 5) - 5G_Zendmast - 04-05-2023 Hi! I'm looking for the exact same thing but I can't seem to get it working. The sample script you refer to is no longer available and I tried using the one you posted but doesn't seem to work I'm using ObiRope 6.5.2 Any chance you know if this feature is updated? ![]() Kind regards. ----------------------- EDIT: I got the script to work by changing the Grab() method with bodyA/bodyB that i saw in the documentation. I made a toggle in the editor so when its enabled the Grab() will be called and it grabs the cable ![]() Though when disabling the toggle so Grab() is no longer called keeps the particle that was grabbed in same position, the Release() method doesn't seem to work or be called. Even when I make a separate toggle for Release() the particle stays in put. Another issue I noticed is that when I test the Grab when the cable is not extended with the cursor it works just fine. But when I test the Grab after the cable is extended it doesn't always seem to work as I would hope it would. The particle gets grabbed but when I move around the particle/cable doesn't follow the object that grabbed the rope perfectly. It lags behind... not sure how to explain it. I feel like I'm almost there, I'm already happy to see that the Grab() works even though its not yet as I hoped it to be. RE: Grabbing a random position on a rope at runtime (obirope 5) - josemendez - 09-05-2023 (04-05-2023, 01:28 PM)5G_Zendmast Wrote: Hi! Hi! This script is included with the asset, it's named ObiContactGrabber and can be found at /Obi/Scripts/Common/Utils/ObiContactGrabber.cs. You're supposed to call the Grab() and Release() methods manually, whenever you want to grab/release the particles that are in contact with the collider. Just tested it in 6.5.2 and it works fine for me, let me know if you need further help. kind regards, RE: Grabbing a random position on a rope at runtime (obirope 5) - 5G_Zendmast - 16-05-2023 (09-05-2023, 11:33 AM)josemendez Wrote: Hi! Hello Jose, Thanks for your reply. I don't know how I missed that.... But yes I found the script now haha. I find it difficult to understand this one as it's not quite working the way I hoped. Whilst testing the script the Grab() and Release() method work, so that's good! ![]() What's not quite working the way I hoped is the location where grabbing occurs. In the attached screenshots, the script is on the object touching the rope, when I enable Grab() it picks a particle way up instead of where it touches the cable. I have no idea why it does this, do you perhaps recognize this behavior? Thanks for your reply. Kind regards, Patrick RE: Grabbing a random position on a rope at runtime (obirope 5) - josemendez - 19-05-2023 (16-05-2023, 02:09 PM)5G_Zendmast Wrote: Whilst testing the script the Grab() and Release() method work, so that's good! Hi Patrick, Is your rope using surface collisions? in that case, collision callbacks work with simplices (See "Retrieving the particle involved in a contact": http://obi.virtualmethodstudio.com/manual/6.3/scriptingcollisions.html), in this case if you're using the old ObiContactGrabber code in this thread instead of the one included with Obi, it won't work correctly. |