<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Obi Official Forum - Obi Rope]]></title>
		<link>https://obi.virtualmethodstudio.com/forum/</link>
		<description><![CDATA[Obi Official Forum - https://obi.virtualmethodstudio.com/forum]]></description>
		<pubDate>Sat, 03 Oct 2026 08:17:16 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Rope end caps]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4657.html</link>
			<pubDate>Mon, 21 Sep 2026 04:39:54 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5388">mechabit</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4657.html</guid>
			<description><![CDATA[How do I add end caps to the rope extruded renderer?<br />
<hr class="mycode_hr" />
Now I'm adding an extra control point to the ends of the rope with 0 thickness, this blocks off the view to the inside of the rope but I don't know if this is bad for the simulation or something. <br />
<br />
At the moment it seems fine.]]></description>
			<content:encoded><![CDATA[How do I add end caps to the rope extruded renderer?<br />
<hr class="mycode_hr" />
Now I'm adding an extra control point to the ends of the rope with 0 thickness, this blocks off the view to the inside of the rope but I don't know if this is bad for the simulation or something. <br />
<br />
At the moment it seems fine.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Chains jitter when surface collsions are turned on]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4656.html</link>
			<pubDate>Mon, 21 Sep 2026 04:01:15 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5388">mechabit</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4656.html</guid>
			<description><![CDATA[Using the chains from the sample scene in a new scene with a large cube for a floor.<br />
<br />
When surface collisions are off they sit still on a large cube but when surface collisions are on they jitter about.<br />
<br />
I need the surface collision turned on otherwise a thin rope will pass right through the chain.<br />
<br />
The rope doesn't jitter with surface collision on.<br />
<br />
The rope has a thickness of 0.04 and resolution 0.113 and has surface collisions on<br />
The chain has thickness 0.1 and resolution 0.43<br />
<br />
I've tried having more or less substeps in the solver, only using cpu backend cos nothing appears on the gpu backend<br />
<br />
What's the solution to have chains that don't allow ropes to pass through and doesn't jitter?]]></description>
			<content:encoded><![CDATA[Using the chains from the sample scene in a new scene with a large cube for a floor.<br />
<br />
When surface collisions are off they sit still on a large cube but when surface collisions are on they jitter about.<br />
<br />
I need the surface collision turned on otherwise a thin rope will pass right through the chain.<br />
<br />
The rope doesn't jitter with surface collision on.<br />
<br />
The rope has a thickness of 0.04 and resolution 0.113 and has surface collisions on<br />
The chain has thickness 0.1 and resolution 0.43<br />
<br />
I've tried having more or less substeps in the solver, only using cpu backend cos nothing appears on the gpu backend<br />
<br />
What's the solution to have chains that don't allow ropes to pass through and doesn't jitter?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Rope Save Load]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4655.html</link>
			<pubDate>Sun, 20 Sep 2026 14:24:17 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5388">mechabit</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4655.html</guid>
			<description><![CDATA[Has anyone got an example script to save and load the position of ropes?]]></description>
			<content:encoded><![CDATA[Has anyone got an example script to save and load the position of ropes?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[A Few Obi Collider Issues]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4654.html</link>
			<pubDate>Sun, 20 Sep 2026 04:07:12 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5387">Skotty</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4654.html</guid>
			<description><![CDATA[I was experimenting with a rope tethered on one end, with a loose rigidbody attached on the other end.  Then I had a mesh with a big hole in it that I added an Obi Collider to.  I pushed the rigidbody through the hole and it fell through pretty normally.  But then if I start moving the rigidbody it can start to cut through the mesh collider of the model with the hole.<br />
<br />
This can seemingly be fixed by adding an Obi Rigidbody to the rigidbody (had to tinker with collision categories so rope wouldn't freak out due to having the end embedded in the rigidbody object, putting them on different categories), and then also setting the attachments dynamic.  I assume that is the correct procedure.<br />
<br />
I'm still having issues with initialization though.  Even though the entire rope is suspended above the mesh with the collider before starting, after going into play mode sometimes part of the rope is stuck inside or beneath the mesh with the hole in it.  How to I avoid this reliably?<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://obi.virtualmethodstudio.com/forum/images/attachtypes/image.png" title="Imagen JPG" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2535" target="_blank" title="">obi-rope-joint-image.jpg</a> (Size: 363.04 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<br />
Thanks for any tips,<br />
<br />
EDIT:  I added a couple of screenshots for reference.  Put them together in one image as I was having trouble getting it to accept attachments.  One is the layout as it looks in the editor.  The other is in play.  The rope has moved a bunch from it's starting position and part of it has embedded in the mesh beneath it.<br />
<br />
- Skotty]]></description>
			<content:encoded><![CDATA[I was experimenting with a rope tethered on one end, with a loose rigidbody attached on the other end.  Then I had a mesh with a big hole in it that I added an Obi Collider to.  I pushed the rigidbody through the hole and it fell through pretty normally.  But then if I start moving the rigidbody it can start to cut through the mesh collider of the model with the hole.<br />
<br />
This can seemingly be fixed by adding an Obi Rigidbody to the rigidbody (had to tinker with collision categories so rope wouldn't freak out due to having the end embedded in the rigidbody object, putting them on different categories), and then also setting the attachments dynamic.  I assume that is the correct procedure.<br />
<br />
I'm still having issues with initialization though.  Even though the entire rope is suspended above the mesh with the collider before starting, after going into play mode sometimes part of the rope is stuck inside or beneath the mesh with the hole in it.  How to I avoid this reliably?<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://obi.virtualmethodstudio.com/forum/images/attachtypes/image.png" title="Imagen JPG" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2535" target="_blank" title="">obi-rope-joint-image.jpg</a> (Size: 363.04 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br />
<br />
Thanks for any tips,<br />
<br />
EDIT:  I added a couple of screenshots for reference.  Put them together in one image as I was having trouble getting it to accept attachments.  One is the layout as it looks in the editor.  The other is in play.  The rope has moved a bunch from it's starting position and part of it has embedded in the mesh beneath it.<br />
<br />
- Skotty]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Suspending Long Rope]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4653.html</link>
			<pubDate>Sat, 19 Sep 2026 22:54:24 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5387">Skotty</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4653.html</guid>
			<description><![CDATA[One last noob question.  What is the right way to do a long suspended rope (like a power line as an example)?  I played with various stretching parameters, mass scale, and one or two other things, but the rope would always drag all the way to the ground (even with stretching scale at 0.001 and stretch compliance at 0).  The one thing that worked was to reduce gravity in the solver.  I can make that work, but is it the right solution?<br />
<br />
I only need a couple of such ropes.  And I could (and may yet) switch those to just static meshes since these particular ones don't really need to move.  But I'd still like to know is there are other parameters I should be adjusting for a long suspended rope.<br />
<br />
Thanks,<br />
<br />
Skotty]]></description>
			<content:encoded><![CDATA[One last noob question.  What is the right way to do a long suspended rope (like a power line as an example)?  I played with various stretching parameters, mass scale, and one or two other things, but the rope would always drag all the way to the ground (even with stretching scale at 0.001 and stretch compliance at 0).  The one thing that worked was to reduce gravity in the solver.  I can make that work, but is it the right solution?<br />
<br />
I only need a couple of such ropes.  And I could (and may yet) switch those to just static meshes since these particular ones don't really need to move.  But I'd still like to know is there are other parameters I should be adjusting for a long suspended rope.<br />
<br />
Thanks,<br />
<br />
Skotty]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Rope Sway in Wind]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4652.html</link>
			<pubDate>Sat, 19 Sep 2026 07:06:44 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5387">Skotty</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4652.html</guid>
			<description><![CDATA[New user here.  Product looks really good so far.  A quick noob question I hope someone doesn't mind answering.  I know there is an Ambient Wind setting on the Obi Solver that ropes react to, but I've been playing around and the rope always seems to stabilize and stop moving (my test rope is hanging suspended between two particle attachments).  If I want some sort of simulated wind turbulence where the rope keeps moving, do I:<br />
<br />
1)  Adjust the settings somehow for that?  If so, what's the trick?<br />
<br />
2)  Use a script, get the Obi Solver component at runtime, and dynamically manipulate the Ambient Wind value (assuming it's accessible)?<br />
<br />
3)  Use a script, dynamically manipulate some control points at runtime to simulate the effect.<br />
<br />
4)  Something else.<br />
<br />
Thanks!<br />
<br />
- Skotty]]></description>
			<content:encoded><![CDATA[New user here.  Product looks really good so far.  A quick noob question I hope someone doesn't mind answering.  I know there is an Ambient Wind setting on the Obi Solver that ropes react to, but I've been playing around and the rope always seems to stabilize and stop moving (my test rope is hanging suspended between two particle attachments).  If I want some sort of simulated wind turbulence where the rope keeps moving, do I:<br />
<br />
1)  Adjust the settings somehow for that?  If so, what's the trick?<br />
<br />
2)  Use a script, get the Obi Solver component at runtime, and dynamically manipulate the Ambient Wind value (assuming it's accessible)?<br />
<br />
3)  Use a script, dynamically manipulate some control points at runtime to simulate the effect.<br />
<br />
4)  Something else.<br />
<br />
Thanks!<br />
<br />
- Skotty]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Weightless Rope]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4651.html</link>
			<pubDate>Fri, 18 Sep 2026 07:38:26 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5386">Caleb1534</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4651.html</guid>
			<description><![CDATA[Hi! I've been trying to find a proper solution to this for awhile but after struggling on it for quite some time and not being able find a relating thread, I decided to ask.<br />
<br />
My case is a 2d platformer, I have two player connected to each other utilizing obi rope's particle attachment. However, gameplay requires some specifics I'm having a hard time achieving. The rope as it does and should, restricts the players from running too far from each other, respects colliders, is affected by gravity. The issue is the rope's weight. <br />
<br />
The i<span style="font-weight: bold;" class="mycode_b">ssue with the rope's weight/ or rather MASS SCALE</span>, is that it <span style="font-weight: bold;" class="mycode_b">drags the players down</span> and causes movement to be inconsistent when consistency is needed. This issue is amplified when a bunch of slack is hanging off a ledge and the tries to jump, they'll be pulled right back down. <br />
<br />
So, what I'm hoping for some guidance on is: how do I make the rope's mass negligible when it comes to dragging down on the players, <span style="font-weight: bold;" class="mycode_b">allowing the rope to be a only a distance restraint?</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Few Attempted Solutions</span><br />
Raising player mass seems like a good direction, but then it really starts to break the rope/ make it stretch and clip through colliders. Is the only real solution to that trying to raise the sub-steps of distance constraints and collisions really high?<br />
<br />
An idea I had was trying to get the total downward pull of the rope, divide that up by active particles, and then apply a constant force to those particles until the player no longer has a positive y velocity. However, that doesn't seem to work, even if it's gravity is set to 0 to in parallel to the jump. This is probably because the weight of the rope is already below the playing suspended so it's dragged down before it has a change to take of still.<br />
<br />
Any help or guidance in the right direction would be super useful! Thanks!]]></description>
			<content:encoded><![CDATA[Hi! I've been trying to find a proper solution to this for awhile but after struggling on it for quite some time and not being able find a relating thread, I decided to ask.<br />
<br />
My case is a 2d platformer, I have two player connected to each other utilizing obi rope's particle attachment. However, gameplay requires some specifics I'm having a hard time achieving. The rope as it does and should, restricts the players from running too far from each other, respects colliders, is affected by gravity. The issue is the rope's weight. <br />
<br />
The i<span style="font-weight: bold;" class="mycode_b">ssue with the rope's weight/ or rather MASS SCALE</span>, is that it <span style="font-weight: bold;" class="mycode_b">drags the players down</span> and causes movement to be inconsistent when consistency is needed. This issue is amplified when a bunch of slack is hanging off a ledge and the tries to jump, they'll be pulled right back down. <br />
<br />
So, what I'm hoping for some guidance on is: how do I make the rope's mass negligible when it comes to dragging down on the players, <span style="font-weight: bold;" class="mycode_b">allowing the rope to be a only a distance restraint?</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Few Attempted Solutions</span><br />
Raising player mass seems like a good direction, but then it really starts to break the rope/ make it stretch and clip through colliders. Is the only real solution to that trying to raise the sub-steps of distance constraints and collisions really high?<br />
<br />
An idea I had was trying to get the total downward pull of the rope, divide that up by active particles, and then apply a constant force to those particles until the player no longer has a positive y velocity. However, that doesn't seem to work, even if it's gravity is set to 0 to in parallel to the jump. This is probably because the weight of the rope is already below the playing suspended so it's dragged down before it has a change to take of still.<br />
<br />
Any help or guidance in the right direction would be super useful! Thanks!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Substep-dependent normalImpulse measurement and friction behavior in Obi Rope 6.5.4]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4647.html</link>
			<pubDate>Thu, 03 Sep 2026 09:13:08 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5381">nakai</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4647.html</guid>
			<description><![CDATA[Hello,<br />
<br />
I found two contact-related issues that appear to depend on the number of substeps in Obi Rope 6.5.4 using the Burst backend.<br />
<br />
Test setup:<br />
<br />
- Rod mass: 2.1 kg (21 particles, 0.1 kg each)<br />
- Fixed timestep: 0.01 seconds<br />
- Incline angle: 45 degrees<br />
- Static friction coefficient: 1<br />
- Dynamic friction coefficient: 1<br />
- Rolling contacts: disabled<br />
- Sleep threshold: 0<br />
<br />
Under these conditions, both the expected normal force and the tangential component of gravity are approximately 14.57 N.<br />
<br />
1. Normal contact force measurement<br />
Simply dividing the final normalImpulse value by either the fixed timestep or the substep duration did not produce an accurate force.<br />
The positional correction applied by the contact constraint is scaled using the number of remaining substeps. <br />
Does this mean that each change in the normal constraint multiplier must be converted using the remaining time at the corresponding substep?<br />
<br />
In my tests, the following conversion produced a normal-force estimate consistent with the expected value:<br />
<br />
normal impulse increment = change in normal Lagrange multiplier / (remaining substeps × substep duration)<br />
<br />
This requires recording the change in normalImpulse at every substep.<br />
 I could not reconstruct the normal force over the full physics step from the value obtained only in the final collision callback using a single time value.<br />
<br />
2. Friction behavior<br />
The friction issue appears to affect not only force measurement but also the motion produced by the simulation.<br />
With one substep, the cable remained approximately in equilibrium on the 45-degree incline. <br />
However, with two or more substeps, the cable slid down the incline even though the timestep, friction coefficients and constraint iteration count were unchanged.<br />
<br />
In a representative test with three substeps:<br />
<br />
- Normal force: approximately 14.57 N<br />
- Friction force actually applied by the simulation: approximately 10.3 N<br />
- Expected limiting Coulomb friction: approximately 14.57 N<br />
<br />
The friction force reconstructed from the contact data agreed with the value calculated independently from the cable’s momentum change. <br />
Therefore, the lower friction value was not only caused by an error in reading the collision callback. The simulation itself appeared to apply approximately 10.3 N of friction.<br />
This suggests that the normal impulse used to calculate the Coulomb friction limit may be underestimated when multiple substeps are used.<br />
To address this behavior, I converted the change in the normal Lagrange multiplier at each substep into a normal impulse using the corresponding remaining interval.<br />
I then accumulated these impulses and used the accumulated value to calculate the Coulomb friction limit.<br />
<br />
I would like to confirm the following points:<br />
<br />
1. In Obi 6.5.4, does normalImpulse require a correction that accounts for the number of remaining substeps?<br />
2. In the Burst backend, can the friction limit used by the simulation depend on the number of substeps?<br />
3. Is converting each substep’s change in the normal Lagrange multiplier using its corresponding remaining interval, accumulating the resulting normal impulses, and using them for the Coulomb friction limit consistent with the intended solver implementation?<br />
4. Has this behavior been changed in newer versions of Obi?<br />
<br />
Thank you.]]></description>
			<content:encoded><![CDATA[Hello,<br />
<br />
I found two contact-related issues that appear to depend on the number of substeps in Obi Rope 6.5.4 using the Burst backend.<br />
<br />
Test setup:<br />
<br />
- Rod mass: 2.1 kg (21 particles, 0.1 kg each)<br />
- Fixed timestep: 0.01 seconds<br />
- Incline angle: 45 degrees<br />
- Static friction coefficient: 1<br />
- Dynamic friction coefficient: 1<br />
- Rolling contacts: disabled<br />
- Sleep threshold: 0<br />
<br />
Under these conditions, both the expected normal force and the tangential component of gravity are approximately 14.57 N.<br />
<br />
1. Normal contact force measurement<br />
Simply dividing the final normalImpulse value by either the fixed timestep or the substep duration did not produce an accurate force.<br />
The positional correction applied by the contact constraint is scaled using the number of remaining substeps. <br />
Does this mean that each change in the normal constraint multiplier must be converted using the remaining time at the corresponding substep?<br />
<br />
In my tests, the following conversion produced a normal-force estimate consistent with the expected value:<br />
<br />
normal impulse increment = change in normal Lagrange multiplier / (remaining substeps × substep duration)<br />
<br />
This requires recording the change in normalImpulse at every substep.<br />
 I could not reconstruct the normal force over the full physics step from the value obtained only in the final collision callback using a single time value.<br />
<br />
2. Friction behavior<br />
The friction issue appears to affect not only force measurement but also the motion produced by the simulation.<br />
With one substep, the cable remained approximately in equilibrium on the 45-degree incline. <br />
However, with two or more substeps, the cable slid down the incline even though the timestep, friction coefficients and constraint iteration count were unchanged.<br />
<br />
In a representative test with three substeps:<br />
<br />
- Normal force: approximately 14.57 N<br />
- Friction force actually applied by the simulation: approximately 10.3 N<br />
- Expected limiting Coulomb friction: approximately 14.57 N<br />
<br />
The friction force reconstructed from the contact data agreed with the value calculated independently from the cable’s momentum change. <br />
Therefore, the lower friction value was not only caused by an error in reading the collision callback. The simulation itself appeared to apply approximately 10.3 N of friction.<br />
This suggests that the normal impulse used to calculate the Coulomb friction limit may be underestimated when multiple substeps are used.<br />
To address this behavior, I converted the change in the normal Lagrange multiplier at each substep into a normal impulse using the corresponding remaining interval.<br />
I then accumulated these impulses and used the accumulated value to calculate the Coulomb friction limit.<br />
<br />
I would like to confirm the following points:<br />
<br />
1. In Obi 6.5.4, does normalImpulse require a correction that accounts for the number of remaining substeps?<br />
2. In the Burst backend, can the friction limit used by the simulation depend on the number of substeps?<br />
3. Is converting each substep’s change in the normal Lagrange multiplier using its corresponding remaining interval, accumulating the resulting normal impulses, and using them for the Coulomb friction limit consistent with the intended solver implementation?<br />
4. Has this behavior been changed in newer versions of Obi?<br />
<br />
Thank you.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Obi Bones With Stretch Bones Get NaN Values]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4640.html</link>
			<pubDate>Wed, 19 Aug 2026 15:27:57 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=4973">Jawsarn</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4640.html</guid>
			<description><![CDATA[As title I'm trying to set up bones to our character, but it seems that at high changes the bones break completley to NaN Values. If I turn stretch bones off, the bones will still break but be in "no active" mode, to show T pose bones transforms.<br />
<br />
Video to show issue<br />
<a href="https://drive.google.com/drive/folders/1QjR6UdoWgbKg7Oi1mPQvplx1lAva8Hga" target="_blank" rel="noopener" class="mycode_url">https://drive.google.com/drive/folders/1...x1lAva8Hga</a><br />
<br />
The only way I've found to get a "completley safe" case is to set up "Use Limits" on the Solver to restrict the simulation area.<br />
<br />
Is this a bug? It feels a bit contradictory to the "unconditionally stable" from documentation <a href="https://obi.virtualmethodstudio.com/manual/7.1/convergence.html" target="_blank" rel="noopener" class="mycode_url">https://obi.virtualmethodstudio.com/manu...gence.html</a>.<br />
<br />
Thanks for input.]]></description>
			<content:encoded><![CDATA[As title I'm trying to set up bones to our character, but it seems that at high changes the bones break completley to NaN Values. If I turn stretch bones off, the bones will still break but be in "no active" mode, to show T pose bones transforms.<br />
<br />
Video to show issue<br />
<a href="https://drive.google.com/drive/folders/1QjR6UdoWgbKg7Oi1mPQvplx1lAva8Hga" target="_blank" rel="noopener" class="mycode_url">https://drive.google.com/drive/folders/1...x1lAva8Hga</a><br />
<br />
The only way I've found to get a "completley safe" case is to set up "Use Limits" on the Solver to restrict the simulation area.<br />
<br />
Is this a bug? It feels a bit contradictory to the "unconditionally stable" from documentation <a href="https://obi.virtualmethodstudio.com/manual/7.1/convergence.html" target="_blank" rel="noopener" class="mycode_url">https://obi.virtualmethodstudio.com/manu...gence.html</a>.<br />
<br />
Thanks for input.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Stable Cosserat Rods]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4636.html</link>
			<pubDate>Mon, 27 Jul 2026 15:46:36 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5168">Qriva0</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4636.html</guid>
			<description><![CDATA[Hi! Are there plans to improve certain simulation aspects using findings from this article (Stable Cosserat Rods Siggraph 2025)?<br />
<a href="https://jerryhsu.io/wp-content/uploads/2025/05/Sig25__Stable_Cosserat_Rods.pdf" target="_blank" rel="noopener" class="mycode_url">https://jerryhsu.io/wp-content/uploads/2...t_Rods.pdf</a>]]></description>
			<content:encoded><![CDATA[Hi! Are there plans to improve certain simulation aspects using findings from this article (Stable Cosserat Rods Siggraph 2025)?<br />
<a href="https://jerryhsu.io/wp-content/uploads/2025/05/Sig25__Stable_Cosserat_Rods.pdf" target="_blank" rel="noopener" class="mycode_url">https://jerryhsu.io/wp-content/uploads/2...t_Rods.pdf</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Adjust position offsets in ObiParticleAttachment]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4633.html</link>
			<pubDate>Wed, 08 Jul 2026 14:34:35 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5368">OstapDev</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4633.html</guid>
			<description><![CDATA[Hi! I created a grappling hook with attachments, and when I initialized it in the ObiParticleAttachment code, position offsets were automatically set. Since there were no public methods in the code to change them, I commented out line 228 in <span style="color: #333333;" class="mycode_color"><span style="font-size: small;" class="mycode_size"><span style="font-family: Tahoma, Verdana, Arial, sans-serif;" class="mycode_font">ObiParticleAttachment.cs</span></span></span>, where these offsets were set.<br />
Please add a checkbox to disable the offsets, or the ability to adjust them. <br />
<br />
Obi Physics Suite v7.1.1]]></description>
			<content:encoded><![CDATA[Hi! I created a grappling hook with attachments, and when I initialized it in the ObiParticleAttachment code, position offsets were automatically set. Since there were no public methods in the code to change them, I commented out line 228 in <span style="color: #333333;" class="mycode_color"><span style="font-size: small;" class="mycode_size"><span style="font-family: Tahoma, Verdana, Arial, sans-serif;" class="mycode_font">ObiParticleAttachment.cs</span></span></span>, where these offsets were set.<br />
Please add a checkbox to disable the offsets, or the ability to adjust them. <br />
<br />
Obi Physics Suite v7.1.1]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Missing Ref Exception on ObiRigidbody2D]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4628.html</link>
			<pubDate>Mon, 08 Jun 2026 11:26:35 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=4841">YouKou</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4628.html</guid>
			<description><![CDATA[Hi,<br />
<br />
After upgrading from Obi 7.0.5 to 7.1.1 I started getting the following exception when I enter play mode:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>MissingReferenceException: The object of type 'Obi.ObiRigidbody2D' has been destroyed but you are still trying to access it.<br />
ObiRigidbody2D.CacheVelocities() at ObiRigidbody2D.cs:61<br />
ObiRigidbody2D.UpdateIfNeeded() at ObiRigidbody2D.cs:71<br />
ObiColliderWorld.UpdateWorld() at ObiColliderWorld.cs:650<br />
ObiSolver.Initialize() at ObiSolver.cs:1330</code></div></div><br />
After a bunch of debugging I was able to identify the root cause. Not sure if this is a known issue or not, so I elected to make a post rather than edit the source code with a potential fix.<br />
<br />
According to my findings the bug is a race condition during initialization (Application.isPlaying is still false at this point, not sure if relevant)<br />
I believe this is the sequence of events:<br />
<br />
1. An ObiCollider's OnEnable fires and creates a collider handle<br />
2. An ObiActor gets enabled, triggering ObiSolver.Initialize() -&gt; ObiColliderWorld.UpdateWorld()<br />
3. During UpdateWorld(), the ObiCollider accesses its Handle property, which creates a rigidbody handle via CreateRigidbody() (after checking if (rigidbodyHandle == null)) and assigns owner - this is HANDLE A (the first handle for this object)<br />
4. ObiRigidbody.OnEnable() fires later and unconditionally calls CreateRigidbody() again, creating HANDLE B for the same body<br />
5. Both handle A and handle B now exist in rigidbodyHandles<br />
6. At some point the ObiRigidbody2D components get disabled, causing OnDisable() to fire for each:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>public void OnDisable()<br />
{<br />
    ObiColliderWorld.GetInstance().DestroyRigidbody(rigidbodyHandle);<br />
}</code></div></div><br />
7. This specifically causes an issue for the object that got double-registered, OnDisable() only knows about the handle currently stored in rigidbodyHandle, which is handle B. It calls DestroyRigidbodyData(handleB), which uses a swap-and-remove pattern:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>private void DestroyRigidbodyData(ObiRigidbodyHandle handle)<br />
{<br />
    if (rigidbodies != null &amp;&amp; handle != null &amp;&amp; handle.isValid &amp;&amp; handle.index &lt; rigidbodyHandles.Count)<br />
    {<br />
        int index = handle.index;<br />
        int lastIndex = rigidbodyHandles.Count - 1;<br />
        rigidbodyHandles.Swap(index, lastIndex);<br />
        rigidbodies.Swap(index, lastIndex);<br />
        rigidbodyHandles[index].index = index; // updates the swapped handle's index<br />
        handle.Invalidate();<br />
        rigidbodyHandles.RemoveAt(lastIndex);<br />
        rigidbodies.count--;<br />
    }<br />
}</code></div></div><br />
8. Handle B is swapped to the last position, removed, and invalidated. The swap may also move handle A to a new position and update its index. Handle A is never invalidated and no code holds a reference to it anymore, so DestroyRigidbody is never called for it<br />
9. Handle A remains in rigidbodyHandles - still appearing valid (isValid is true), but its owner is a now-destroyed ObiRigidbody2D<br />
10. On the next UpdateWorld() call, iterating rigidbodyHandles hits handle A -&gt; MissingReferenceException<br />
<br />
The Handle property getter already has a null-check to prevent duplicate creation, but ObiRigidbody.OnEnable() does not:<br />
<br />
// Handle getter - has null check (safe)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>if (rigidbodyHandle == null)<br />
{<br />
    rigidbodyHandle = world.CreateRigidbody();<br />
    rigidbodyHandle.owner = this;<br />
}</code></div></div><br />
<br />
// OnEnable - no null check (creates duplicate)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>protected virtual void OnEnable()<br />
{<br />
    rigidbodyHandle = ObiColliderWorld.GetInstance().CreateRigidbody();<br />
    rigidbodyHandle.owner = this;<br />
}</code></div></div><br />
Only one object ends up with a duplicate because the race condition depends on the specific initialization order; only the object whose ObiCollider initializes before its ObiRigidbody AND before the solver finishes initializing will hit this path.<br />
<br />
This did not occur in 7.0.5 for me, not really sure why.<br />
<br />
The current simple fix that works for me is adding the null check to onEnable() as well; but as I said I wanted to check if this issue has a fix on the way, or if there is a known way to avoid this situation. I also don't get the exception if I enter play mode with the rigidbody disabled then enable it manually later (which makes sense since we avoid the init order issues entirely).<br />
<br />
Is there a fix on the way? or a best practice that I'm forgetting that avoids this issue?<br />
<br />
Thanks in advance!]]></description>
			<content:encoded><![CDATA[Hi,<br />
<br />
After upgrading from Obi 7.0.5 to 7.1.1 I started getting the following exception when I enter play mode:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>MissingReferenceException: The object of type 'Obi.ObiRigidbody2D' has been destroyed but you are still trying to access it.<br />
ObiRigidbody2D.CacheVelocities() at ObiRigidbody2D.cs:61<br />
ObiRigidbody2D.UpdateIfNeeded() at ObiRigidbody2D.cs:71<br />
ObiColliderWorld.UpdateWorld() at ObiColliderWorld.cs:650<br />
ObiSolver.Initialize() at ObiSolver.cs:1330</code></div></div><br />
After a bunch of debugging I was able to identify the root cause. Not sure if this is a known issue or not, so I elected to make a post rather than edit the source code with a potential fix.<br />
<br />
According to my findings the bug is a race condition during initialization (Application.isPlaying is still false at this point, not sure if relevant)<br />
I believe this is the sequence of events:<br />
<br />
1. An ObiCollider's OnEnable fires and creates a collider handle<br />
2. An ObiActor gets enabled, triggering ObiSolver.Initialize() -&gt; ObiColliderWorld.UpdateWorld()<br />
3. During UpdateWorld(), the ObiCollider accesses its Handle property, which creates a rigidbody handle via CreateRigidbody() (after checking if (rigidbodyHandle == null)) and assigns owner - this is HANDLE A (the first handle for this object)<br />
4. ObiRigidbody.OnEnable() fires later and unconditionally calls CreateRigidbody() again, creating HANDLE B for the same body<br />
5. Both handle A and handle B now exist in rigidbodyHandles<br />
6. At some point the ObiRigidbody2D components get disabled, causing OnDisable() to fire for each:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>public void OnDisable()<br />
{<br />
    ObiColliderWorld.GetInstance().DestroyRigidbody(rigidbodyHandle);<br />
}</code></div></div><br />
7. This specifically causes an issue for the object that got double-registered, OnDisable() only knows about the handle currently stored in rigidbodyHandle, which is handle B. It calls DestroyRigidbodyData(handleB), which uses a swap-and-remove pattern:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>private void DestroyRigidbodyData(ObiRigidbodyHandle handle)<br />
{<br />
    if (rigidbodies != null &amp;&amp; handle != null &amp;&amp; handle.isValid &amp;&amp; handle.index &lt; rigidbodyHandles.Count)<br />
    {<br />
        int index = handle.index;<br />
        int lastIndex = rigidbodyHandles.Count - 1;<br />
        rigidbodyHandles.Swap(index, lastIndex);<br />
        rigidbodies.Swap(index, lastIndex);<br />
        rigidbodyHandles[index].index = index; // updates the swapped handle's index<br />
        handle.Invalidate();<br />
        rigidbodyHandles.RemoveAt(lastIndex);<br />
        rigidbodies.count--;<br />
    }<br />
}</code></div></div><br />
8. Handle B is swapped to the last position, removed, and invalidated. The swap may also move handle A to a new position and update its index. Handle A is never invalidated and no code holds a reference to it anymore, so DestroyRigidbody is never called for it<br />
9. Handle A remains in rigidbodyHandles - still appearing valid (isValid is true), but its owner is a now-destroyed ObiRigidbody2D<br />
10. On the next UpdateWorld() call, iterating rigidbodyHandles hits handle A -&gt; MissingReferenceException<br />
<br />
The Handle property getter already has a null-check to prevent duplicate creation, but ObiRigidbody.OnEnable() does not:<br />
<br />
// Handle getter - has null check (safe)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>if (rigidbodyHandle == null)<br />
{<br />
    rigidbodyHandle = world.CreateRigidbody();<br />
    rigidbodyHandle.owner = this;<br />
}</code></div></div><br />
<br />
// OnEnable - no null check (creates duplicate)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>protected virtual void OnEnable()<br />
{<br />
    rigidbodyHandle = ObiColliderWorld.GetInstance().CreateRigidbody();<br />
    rigidbodyHandle.owner = this;<br />
}</code></div></div><br />
Only one object ends up with a duplicate because the race condition depends on the specific initialization order; only the object whose ObiCollider initializes before its ObiRigidbody AND before the solver finishes initializing will hit this path.<br />
<br />
This did not occur in 7.0.5 for me, not really sure why.<br />
<br />
The current simple fix that works for me is adding the null check to onEnable() as well; but as I said I wanted to check if this issue has a fix on the way, or if there is a known way to avoid this situation. I also don't get the exception if I enter play mode with the rigidbody disabled then enable it manually later (which makes sense since we avoid the init order issues entirely).<br />
<br />
Is there a fix on the way? or a best practice that I'm forgetting that avoids this issue?<br />
<br />
Thanks in advance!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Obi Rope Contraint Settings buggy]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4627.html</link>
			<pubDate>Sat, 23 May 2026 18:49:07 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5360">Shirley55</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4627.html</guid>
			<description><![CDATA[Hi there!<br />
<br />
I have a problem with my ObiRope Settings! <br />
<br />
This is my Setup: I have three levels. I added my character prefab to each level. This Prefab has an Obi Solver plus Rope attached to it. The Obi Solver itself is not a prefab, but the parent object. Also, in each level, they have the same Blueprint asset. I have a TestScene, where I first set up the whole Character prefab. Then i copied the Prefab into the other scenes.<br />
<br />
This is what I want to do: For each Level I want my character to have different Tear Resistance and Stretching Compliance, the rest of the rope settings should be exactly the same. <br />
<br />
<img src="https://obi.virtualmethodstudio.com/forum/images/smilies/exclamation.png" alt="Exclamación" title="Exclamación" class="smilie smilie_15" /> This is my problem: In my Levels, the rope doesn't adopt the changed settings that I just made. It always stays the same length. Or it has settings from another level.  <br />
<br />
What I tried to do: I tried to create a new blueprint in the separate levels, but also then, the rope took settings from a different level. I unpacked the prefab, so the Obi solver is not a prefab anymore. Still the same issue. In my testscene though, I have a script where i can change the settings on key press and this perfectly works.<br />
<br />
So my main question is, how can i have the same rope across multiple scenes and then change only 2 variables?<br />
<br />
I would be really happy about some help and maybe someone could explain to me, how blueprints actually work and what information they safe.<br />
Thanks you in advance! <img src="https://obi.virtualmethodstudio.com/forum/images/smilies/heart.png" alt="Corazón" title="Corazón" class="smilie smilie_16" /><br />
<br />
Shirley55]]></description>
			<content:encoded><![CDATA[Hi there!<br />
<br />
I have a problem with my ObiRope Settings! <br />
<br />
This is my Setup: I have three levels. I added my character prefab to each level. This Prefab has an Obi Solver plus Rope attached to it. The Obi Solver itself is not a prefab, but the parent object. Also, in each level, they have the same Blueprint asset. I have a TestScene, where I first set up the whole Character prefab. Then i copied the Prefab into the other scenes.<br />
<br />
This is what I want to do: For each Level I want my character to have different Tear Resistance and Stretching Compliance, the rest of the rope settings should be exactly the same. <br />
<br />
<img src="https://obi.virtualmethodstudio.com/forum/images/smilies/exclamation.png" alt="Exclamación" title="Exclamación" class="smilie smilie_15" /> This is my problem: In my Levels, the rope doesn't adopt the changed settings that I just made. It always stays the same length. Or it has settings from another level.  <br />
<br />
What I tried to do: I tried to create a new blueprint in the separate levels, but also then, the rope took settings from a different level. I unpacked the prefab, so the Obi solver is not a prefab anymore. Still the same issue. In my testscene though, I have a script where i can change the settings on key press and this perfectly works.<br />
<br />
So my main question is, how can i have the same rope across multiple scenes and then change only 2 variables?<br />
<br />
I would be really happy about some help and maybe someone could explain to me, how blueprints actually work and what information they safe.<br />
Thanks you in advance! <img src="https://obi.virtualmethodstudio.com/forum/images/smilies/heart.png" alt="Corazón" title="Corazón" class="smilie smilie_16" /><br />
<br />
Shirley55]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Looking for suggestions on a physical-feeling rope extension]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4626.html</link>
			<pubDate>Fri, 22 May 2026 19:42:17 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=5281">trentthebaker</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4626.html</guid>
			<description><![CDATA[Hello, I'm revisiting a problem that I ran into a while ago but wasn't able to figure out. I had made <a href="https://obi.virtualmethodstudio.com/forum/thread-4584.html" target="_blank" rel="noopener" class="mycode_url">an old thread</a> previously.<br />
<br />
In short, I'm hoping to use ObiRope to make a rope that reliably extends based on force applied. I've seen in a few threads the recommended approach is to find the "strain" by comparing rope.CalculateLength and rope.restLength, but I find the result of this calculation doesn't cleanly translate to force on the end of a rope in a lot of cases. I am hoping to find something that feels like a magician pulling scarves out of their sleeve- maybe a cursor can't achieve the feel I'm going for?<br />
<br />
I'd appreciate any tips!<br />
<br />
Trent]]></description>
			<content:encoded><![CDATA[Hello, I'm revisiting a problem that I ran into a while ago but wasn't able to figure out. I had made <a href="https://obi.virtualmethodstudio.com/forum/thread-4584.html" target="_blank" rel="noopener" class="mycode_url">an old thread</a> previously.<br />
<br />
In short, I'm hoping to use ObiRope to make a rope that reliably extends based on force applied. I've seen in a few threads the recommended approach is to find the "strain" by comparing rope.CalculateLength and rope.restLength, but I find the result of this calculation doesn't cleanly translate to force on the end of a rope in a lot of cases. I am hoping to find something that feels like a magician pulling scarves out of their sleeve- maybe a cursor can't achieve the feel I'm going for?<br />
<br />
I'd appreciate any tips!<br />
<br />
Trent]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Extending Grappling Hook & Collision Detection]]></title>
			<link>https://obi.virtualmethodstudio.com/forum/thread-4621.html</link>
			<pubDate>Sat, 09 May 2026 00:24:15 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://obi.virtualmethodstudio.com/forum/member.php?action=profile&uid=1250">docgonzzo</a>]]></dc:creator>
			<guid isPermaLink="false">https://obi.virtualmethodstudio.com/forum/thread-4621.html</guid>
			<description><![CDATA[Hello!<br />
<br />
<br />
<br />
I am having a problem where I'm extending a rope like ExtendableGrapplingHook.cs example.<br />
<br />
<br />
<br />
Mine is a little different in that the rope is a fixed length. If the end particle (i.e. Hook) doesn't hit anything while the rope is extending it will just flop to the ground.<br />
<br />
<br />
<br />
When first extending, I am using the same method of extending the rope.. basically LayParticlesInStraightLine() function from the Grappling Hook example.<br />
<br />
<br />
<br />
I'm using the OnCollision callback to check if the rope's last/end particle hit something while extending.<br />
<br />
<br />
<br />
If the end particle collides with something it can "Grapple", I add an ObiParticleAttachment to the last particle, and connect it to the object it collided with.<br />
<br />
<br />
<br />
I will then stop LayParticlesInStraightLine, and just finish deploying the rope from the base until it's fully extended.<br />
<br />
<br />
<br />
The problem is that the end of the rope sometimes passes through the object before the attachment can happen. It should connect at the exact point it first touched the object, but it sometimes attaches half-way through or even sometimes on the opposite side.<br />
<br />
<br />
<br />
I have tried increasing the Collision constraint Iterations but it doesn't seem to help much. I suspect I'm doing something wrong..<br />
<br />
<br />
<br />
Below are the functions I'm using to extend my rope (aka grappling hook) and where I check OnCollision callback for that last particle contact..<br />
<br />
<br />
<br />
Any help would be appreciated as always!!<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://obi.virtualmethodstudio.com/forum/images/attachtypes/image.png" title="Imagen PNG" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2529" target="_blank" title="">Screenshot 2026-05-08 192220.png</a> (Size: 25.89 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment --><br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>IEnumerator ExtendTetherCR()<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return null; //skip a step. then go.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;extending = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;extended = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracting = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracted = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;lastParticleContact = false;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Procedurally generate the rope path (just a short segment, as we will extend it over time):<br />
&nbsp;&nbsp;&nbsp;&nbsp;int filter = ObiUtils.MakeFilter(collidesWithMask, collisionCategory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.Clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.AddControlPoint(Vector3.zero, Vector3.zero, Vector3.zero, Vector3.up, sectionMass, sectionRotMass, 0.1f, filter, Color.white, "Start");<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.AddControlPoint(localDirection * 0.1f, Vector3.zero, Vector3.zero, Vector3.up, sectionMass, sectionRotMass, 0.1f, filter, Color.white, "End");<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.FlushEvents();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Generate the particle representation of the rope (wait until it has finished):<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return blueprint.Generate();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Set the blueprint (this adds particles/constraints to the solver and starts simulating them).<br />
&nbsp;&nbsp;&nbsp;&nbsp;rope.ropeBlueprint = blueprint;<br />
&nbsp;&nbsp;&nbsp;&nbsp;rope.GetComponent&lt;ObiRopeExtrudedRenderer&gt;().enabled = true;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return new WaitForFixedUpdate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA = rope.gameObject.AddComponent&lt;ObiParticleAttachment&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;ObiParticleGroup startPG = rope.ropeBlueprint.groups[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA.target = shipAttachment.transform;<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA.particleGroup = startPG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA.attachmentType = ObiParticleAttachment.AttachmentType.Dynamic;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;cursor = rope.gameObject.AddComponent&lt;ObiRopeCursor&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;cursor.cursorMu = 0.0f; //Mu=0 means the start of the rope. .05 is the middle of the rope.<br />
&nbsp;&nbsp;&nbsp;&nbsp;cursor.direction = true; //true means we extend from start to end.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("Entend: rope.elements.Count: " + rope.elements.Count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Vector3 direction = tetherDirectionHandle.transform.localPosition.normalized;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (true )<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector3 origin = solver.transform.InverseTransformPoint(rope.transform.position);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float length = 0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!lastParticleContact)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; rope.elements.Count; ++i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int p1 = rope.elements[i].particle1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int p2 = rope.elements[i].particle2;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solver.prevPositions[p1] = solver.positions[p1] = origin + direction * length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length += rope.elements[i].restLength;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solver.prevPositions[p2] = solver.positions[p2] = origin + direction * length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float distanceLeft = tetherTargetLength - cursor.ChangeLength(tetherShootSpeed * Time.deltaTime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("distanceLeft: " + distanceLeft);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (distanceLeft &lt; 0 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.cursorMu = 1.0f;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.ChangeLength(distanceLeft);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield return null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return new WaitForFixedUpdate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;extending = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;extended = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracting = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracted = false;<br />
<br />
<br />
}</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&nbsp;&nbsp;&nbsp;&nbsp;void Solver_OnCollision(object sender, ObiNativeContactList e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///no need to check collisions if the tether is currently connected to something or in the process of retracting..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (otherPA != null || retracting)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("Sender name: " + sender.ToString());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var world = ObiColliderWorld.GetInstance();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//iterate over all contacts in the current frame:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (Oni.Contact contact in e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if this one is an actual collision:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (contact.distance &lt; collisionDistance)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObiColliderBase col = world.colliderHandles[contact.bodyB].owner;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (col != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//if we are here we know particles are colliding with something..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("ObiRope Colliding with something: " + col.gameObject.name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rope.solver.simplices[contact.bodyA] == rope.elements[rope.elements.Count - 1].particle2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//if we are here we know it's the last particle in the rope that collided with something. Stop exending in the handle direction now!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    //Debug.Log("Rope Last Particle Contacted: " + col.gameObject.name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastParticleContact = true;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if (col.gameObject.layer == 15)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((attachmentMask &amp; (1 &lt;&lt; col.gameObject.layer)) != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//if we are here, we know the last particle in the rope should attach to what it collided with!<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA = rope.gameObject.AddComponent&lt;ObiParticleAttachment&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObiParticleGroup endPG = rope.ropeBlueprint.groups[1];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA.target = col.transform;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA.particleGroup = endPG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA.attachmentType = ObiParticleAttachment.AttachmentType.Dynamic;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("Tether attached!");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div>]]></description>
			<content:encoded><![CDATA[Hello!<br />
<br />
<br />
<br />
I am having a problem where I'm extending a rope like ExtendableGrapplingHook.cs example.<br />
<br />
<br />
<br />
Mine is a little different in that the rope is a fixed length. If the end particle (i.e. Hook) doesn't hit anything while the rope is extending it will just flop to the ground.<br />
<br />
<br />
<br />
When first extending, I am using the same method of extending the rope.. basically LayParticlesInStraightLine() function from the Grappling Hook example.<br />
<br />
<br />
<br />
I'm using the OnCollision callback to check if the rope's last/end particle hit something while extending.<br />
<br />
<br />
<br />
If the end particle collides with something it can "Grapple", I add an ObiParticleAttachment to the last particle, and connect it to the object it collided with.<br />
<br />
<br />
<br />
I will then stop LayParticlesInStraightLine, and just finish deploying the rope from the base until it's fully extended.<br />
<br />
<br />
<br />
The problem is that the end of the rope sometimes passes through the object before the attachment can happen. It should connect at the exact point it first touched the object, but it sometimes attaches half-way through or even sometimes on the opposite side.<br />
<br />
<br />
<br />
I have tried increasing the Collision constraint Iterations but it doesn't seem to help much. I suspect I'm doing something wrong..<br />
<br />
<br />
<br />
Below are the functions I'm using to extend my rope (aka grappling hook) and where I check OnCollision callback for that last particle contact..<br />
<br />
<br />
<br />
Any help would be appreciated as always!!<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://obi.virtualmethodstudio.com/forum/images/attachtypes/image.png" title="Imagen PNG" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2529" target="_blank" title="">Screenshot 2026-05-08 192220.png</a> (Size: 25.89 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment --><br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>IEnumerator ExtendTetherCR()<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return null; //skip a step. then go.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;extending = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;extended = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracting = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracted = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;lastParticleContact = false;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Procedurally generate the rope path (just a short segment, as we will extend it over time):<br />
&nbsp;&nbsp;&nbsp;&nbsp;int filter = ObiUtils.MakeFilter(collidesWithMask, collisionCategory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.Clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.AddControlPoint(Vector3.zero, Vector3.zero, Vector3.zero, Vector3.up, sectionMass, sectionRotMass, 0.1f, filter, Color.white, "Start");<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.AddControlPoint(localDirection * 0.1f, Vector3.zero, Vector3.zero, Vector3.up, sectionMass, sectionRotMass, 0.1f, filter, Color.white, "End");<br />
&nbsp;&nbsp;&nbsp;&nbsp;blueprint.path.FlushEvents();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Generate the particle representation of the rope (wait until it has finished):<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return blueprint.Generate();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Set the blueprint (this adds particles/constraints to the solver and starts simulating them).<br />
&nbsp;&nbsp;&nbsp;&nbsp;rope.ropeBlueprint = blueprint;<br />
&nbsp;&nbsp;&nbsp;&nbsp;rope.GetComponent&lt;ObiRopeExtrudedRenderer&gt;().enabled = true;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return new WaitForFixedUpdate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA = rope.gameObject.AddComponent&lt;ObiParticleAttachment&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;ObiParticleGroup startPG = rope.ropeBlueprint.groups[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA.target = shipAttachment.transform;<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA.particleGroup = startPG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;shipPA.attachmentType = ObiParticleAttachment.AttachmentType.Dynamic;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;cursor = rope.gameObject.AddComponent&lt;ObiRopeCursor&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;cursor.cursorMu = 0.0f; //Mu=0 means the start of the rope. .05 is the middle of the rope.<br />
&nbsp;&nbsp;&nbsp;&nbsp;cursor.direction = true; //true means we extend from start to end.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("Entend: rope.elements.Count: " + rope.elements.Count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Vector3 direction = tetherDirectionHandle.transform.localPosition.normalized;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (true )<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector3 origin = solver.transform.InverseTransformPoint(rope.transform.position);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float length = 0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!lastParticleContact)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; rope.elements.Count; ++i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int p1 = rope.elements[i].particle1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int p2 = rope.elements[i].particle2;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solver.prevPositions[p1] = solver.positions[p1] = origin + direction * length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length += rope.elements[i].restLength;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solver.prevPositions[p2] = solver.positions[p2] = origin + direction * length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float distanceLeft = tetherTargetLength - cursor.ChangeLength(tetherShootSpeed * Time.deltaTime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("distanceLeft: " + distanceLeft);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (distanceLeft &lt; 0 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.cursorMu = 1.0f;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.ChangeLength(distanceLeft);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield return null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return new WaitForFixedUpdate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;yield return null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;extending = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;extended = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracting = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;retracted = false;<br />
<br />
<br />
}</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&nbsp;&nbsp;&nbsp;&nbsp;void Solver_OnCollision(object sender, ObiNativeContactList e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///no need to check collisions if the tether is currently connected to something or in the process of retracting..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (otherPA != null || retracting)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("Sender name: " + sender.ToString());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var world = ObiColliderWorld.GetInstance();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//iterate over all contacts in the current frame:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (Oni.Contact contact in e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if this one is an actual collision:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (contact.distance &lt; collisionDistance)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObiColliderBase col = world.colliderHandles[contact.bodyB].owner;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (col != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//if we are here we know particles are colliding with something..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("ObiRope Colliding with something: " + col.gameObject.name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rope.solver.simplices[contact.bodyA] == rope.elements[rope.elements.Count - 1].particle2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//if we are here we know it's the last particle in the rope that collided with something. Stop exending in the handle direction now!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    //Debug.Log("Rope Last Particle Contacted: " + col.gameObject.name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastParticleContact = true;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if (col.gameObject.layer == 15)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((attachmentMask &amp; (1 &lt;&lt; col.gameObject.layer)) != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//if we are here, we know the last particle in the rope should attach to what it collided with!<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA = rope.gameObject.AddComponent&lt;ObiParticleAttachment&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObiParticleGroup endPG = rope.ropeBlueprint.groups[1];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA.target = col.transform;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA.particleGroup = endPG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherPA.attachmentType = ObiParticleAttachment.AttachmentType.Dynamic;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Debug.Log("Tether attached!");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div>]]></content:encoded>
		</item>
	</channel>
</rss>