Hi, I have 2 issues with enabling the closed path property of my obi rope.
1. The Obi Rope Extruded Renderer Material does not smoothly connect at the ends of the rope, and as a result, there is a visible gap.
2. I get a very strange behavior at the connected ends of my closed rope if I shrink it too fast using the Obi Rope Cursor. The connection between the first and last particles looks "broken", and those two particles also don't get affected by gravity correctly. Instead, they "slide" downwards much slower than gravity would dictate.
Is there a way to fix these issues and make a rope that looks and acts more like a real loop of rope? Thank you!
Could reproduce the first one (incorrect rope mesh frame orientation for the last segment in a looped/closed rope), a fix is underway. I've been unable to reproduce the cursor one though. Would it be possible to share your cursor settings (cursor, source and direction) as well as the script you're using to use the cursor?
06-05-2026, 10:13 AM (This post was last modified: 06-05-2026, 10:14 AM by josemendez.)
Attached to this post you'll find patched files for both the Burst and Compute backends. Replacing the ones in your project with these should fix the first issue, getting rid of the gap at the end of closed ropes.
Thank you so much! The 2 files you provided fixed my 1st issue!
Regarding the 2nd issue, my cursor settings are: Cursor Mu = 0.7 Source Mu = 0.3 Direction unchecked (I tried checking it and that didn't help)
I've attached the script I have attached to the rope. My apologies for the atrocious looking code, but my guess is that the issue is contained within IEnumerator Shrink(), which is at the very bottom of the script. When I don't call it, the issue doesn't arise. Also, here is a gif of the issue in action Loop Problem - Gifyu
(08-05-2026, 12:03 PM)josemendez Wrote: Thanks! will take a look and get back to you asap.
I think I figured out an alternate way to do what I want to do, but I'm having trouble with what I think might be pretty basic ObiRope functionality, so sorry if this is a really basic question.
What I'm now trying to do is the following: I have a not closed rope that deforms during run time (including getting elongated and shrunk using a cursor). I would like to call a function during runtime that closes the rope (without changing anything else). The ends of the rope are very close to each other when I call this function, so there should not be a huge visible change. The way I'm trying to do it is to create a new blueprint during runtime using the rope's shape, close that blueprint, and then assign that blueprint to the rope. I could be messing up more than I know, but at the very least my particle positions seem to be wrong, because the rope teleports a short distance away when I call my function (my previous issues are not happening though which is good). I've been looking at different resources for guidance, but mostly this page Obi Physics for Unity - Scripting Particles and this thread Manually Placing Rope Particles. I have attached the code for my function to this reply. I appreciate all your help and apologies if I'm misunderstanding something basic.
// Calculate control point positions and tangent vector:
Vector3 startPositionLS;
Vector3 endPositionLS;
Vector3 tangentLS;
// Create the blueprint:
var blueprint = ScriptableObject.CreateInstance<ObiRopeBlueprint>();
// Build the rope path:
int filter = ObiUtils.MakeFilter(ObiUtils.CollideWithEverything, 0);
ObiActor actor = rope.GetComponent<ObiActor>();
for (int i = 0; i < actor.activeParticleCount - 1; ++i)
{
// retrieve the particle index in the solver:
int solverIndex = actor.solverIndices[i];
startPositionLS = actor.solver.positions[solverIndex];
endPositionLS = actor.solver.positions[solverIndex + 1];
(15-05-2026, 04:36 AM)N_U_P Wrote: I think I figured out an alternate way to do what I want to do, but I'm having trouble with what I think might be pretty basic ObiRope functionality, so sorry if this is a really basic question.
What I'm now trying to do is the following: I have a not closed rope that deforms during run time (including getting elongated and shrunk using a cursor). I would like to call a function during runtime that closes the rope (without changing anything else). The ends of the rope are very close to each other when I call this function, so there should not be a huge visible change. The way I'm trying to do it is to create a new blueprint during runtime using the rope's shape, close that blueprint, and then assign that blueprint to the rope. I could be messing up more than I know, but at the very least my particle positions seem to be wrong, because the rope teleports a short distance away when I call my function (my previous issues are not happening though which is good). I've been looking at different resources for guidance, but mostly this page Obi Physics for Unity - Scripting Particles and this thread Manually Placing Rope Particles. I have attached the code for my function to this reply. I appreciate all your help and apologies if I'm misunderstanding something basic.
// Calculate control point positions and tangent vector:
Vector3 startPositionLS;
Vector3 endPositionLS;
Vector3 tangentLS;
// Create the blueprint:
var blueprint = ScriptableObject.CreateInstance<ObiRopeBlueprint>();
// Build the rope path:
int filter = ObiUtils.MakeFilter(ObiUtils.CollideWithEverything, 0);
ObiActor actor = rope.GetComponent<ObiActor>();
for (int i = 0; i < actor.activeParticleCount - 1; ++i)
{
// retrieve the particle index in the solver:
int solverIndex = actor.solverIndices[i];
startPositionLS = actor.solver.positions[solverIndex];
endPositionLS = actor.solver.positions[solverIndex + 1];
“ All spatial properties (positions, orientations, velocities, vorticities, etc) are expressed in the solver's local space.”
Conversely, blueprint data (since they’re assets, and hence not tied to a particular scene) is expressed in object space, just like mesh data in Unity.
Specifically, you must convert the solver particle positions to the target rope’s local space while assigning them.
The second issue is that you’re assuming particles appear in the rope’s arrays in the same order they’re physically laid out in the rope. This is seldom the case, you should use elements instead: https://obi.virtualmethodstudio.com/manu...ropes.html
“ All spatial properties (positions, orientations, velocities, vorticities, etc) are expressed in the solver's local space.”
Conversely, blueprint data (since they’re assets, and hence not tied to a particular scene) is expressed in object space, just like mesh data in Unity.
Specifically, you must convert the solver particle positions to the target rope’s local space while assigning them.
The second issue is that you’re assuming particles appear in the rope’s arrays in the same order they’re physically laid out in the rope. This is seldom the case, you should use elements instead: https://obi.virtualmethodstudio.com/manu...ropes.html
Let me know if you need further help,
Kind regards,
Thank you so much!! Those two things (along with realizing I needed to set the rope resolution to 0 if I was making every single rope particle a control point) solved all my issues!