• Advertisement
Sign in to follow this  

rope simulation not working quite right (long)

This topic is 4795 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi! (sorry long post) I'm currently working on a rope simulation for another piece of software and almost got it going, but i'm not sure if I implenting it using the ideal method. Current I'm using a variant of Nehe's method, where you have a rope 0----0----0-----0 where 0 = control point and ---- = Link between control points And I keep track of the Links between each control point. Then to simulate the rope I loop though the Links and use the standard Hooke's Law spring formulae as stated in Gamasutra's "Exploring Spring Model" My code looks something like this Pseudo Code
// Implementation 1
LOOP THROUGH LINKS
  
  // Get the control points connected to this link
  MASS1 = CURRENTLINK.GETCONTROLPOINT1
  MASS2 = CURRENTLINK.GETCONTROLPOINT2

  // Resets Forces
  MASS1,APPLYFORCE ( 0 )
  MASS2.APPLYFORCE ( 0 )

  // Run the Hookes law caluclation
  FORCE = CALCULATE_HOOKES_LAW(MASS1,MASS2)

  // Apply force onto masses (using newtons third law)
  MASS1.APPLYFORCE (  FORCE )
  MASS2.APPLYFORCE ( -FORCE )

  // Apply additional force gravity
  MASS1.APPLYFORCE ( GRAVITY )
  MASS2.APPLYFORCE ( GRAVITY )


  // Use euler method to position Masses
  EULER_METHOD ( MASS1 )
  EULER_METHOD ( MASS2 )

END LOOP
The above pseudo code works almost exactly how I want, the problem that's happening is that the Gravity is being applied twice on some masses ( because two links can share the same Control Point ), because of this, my rope control points become uneven and are closer towards each other at the end of the rope, as shown in this image: http://www.spot4d.co.uk/0x47/rope_hang.jpg This becomes a big problem when I have lots of Control Points (30+), the rope will stretch really long, even though I'm using a 100% stiffness in the Hookes Law algorithm. To solve this problem I tried another way to apply gravity Pseudo Code
// Implementation 2
LOOP THROUGH LINKS
  
  // Get the control points connected to this link
  MASS1 = CURRENTLINK.GETCONTROLPOINT1
  MASS2 = CURRENTLINK.GETCONTROLPOINT2

  // Resets Forces
  MASS1,APPLYFORCE ( 0 )
  MASS2.APPLYFORCE ( 0 )

  // Run the Hookes law caluclation
  FORCE = CALCULATE_HOOKES_LAW(MASS1,MASS2)

  // Apply force onto masses (using newtons third law)
  MASS1.APPLYFORCE (  FORCE )
  MASS2.APPLYFORCE ( -FORCE )

END LOOP

LOOP THROUGH CONTROL_POINTS
  CURRENT_CONTROL_POINT.APPLYFORCE ( GRAVITY )
  
  EULER_METHOD ( CURRENT_CONTROL_POINT )
END LOOP
The result of the above snippet worked fine, all the control points were evenly spaced out as they hung due to gravity. But I neglected to mention that I can set any of the Control Points to act as an anchor, basically the EULER_METHOD is not called if the Control Point is flagged Anchor. If I anchored the Control Points at the start and end of the rope, the rope should curve in the middle due to gravity. Now here is my main problem after all that reading, if I use the orignal implementation (where gravity is applied twice on the control points) I get a correct curve on the rope, as shown in this image: http://www.spot4d.co.uk/0x47/rope_correct.jpg But as mentioned above I can't do it like this because the gravity applying twice causes problems. So if I use the second implementation, the simulation seems to ignore my anchored points, and hangs down regardless, as shown in this image: http://www.spot4d.co.uk/0x47/rope_problem.jpg As you can see, the rope hangs below the first control point and completely ignores the last control point. I don't understand why it is doing this I hope you managed to read it all :) and that I made myself clear Thanks for your help

Share this post


Link to post
Share on other sites
Advertisement
Why don't you add a flag to each control point that specifies whether gravity has been applied already? You then apply gravity only if it hasn't been applied, set the flag every time you apply it, and reset all the flags at the end of each frame.

Share this post


Link to post
Share on other sites
Thanks CoffeeMug.

To tell you the truth, I simply didn't think of doing that!

Well I tried it and it acts like it I want, so its working now

But I feel like this is a hack way of doing it, adding extra forces would result in adding more flags. For now I will do it like this so I can continue with other parts of my software, but I would really like to know if I was doing something wrong altogether

Share this post


Link to post
Share on other sites
It isn't a hack. You don't need to add a flag per force, only a flag per control point. Once you process the forces for each control point, you don't do it again in the same frame. Alternatively you could iterate through control points instead of iterating through links. It all depends on your simulation.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement