7

Let's say I'm trying to create a ninja lowering himself down a rope, or pulling himself back up, all whilst he might be swinging from side to side or hit by objects. Basically like http://ninja.frozenfractal.com/ but with Box2D instead of hacky JavaScript.

Ideally I would like to use a rope joint in Box2D that allows me to change the length after construction. The standard Box2D RopeJoint doesn't offer that functionality.

I've considered a PulleyJoint, connecting the other end of the "pulley" to an invisible kinematic body that I can control to change the length, but PulleyJoint is more like a rod than a rope: it constrains maximum length, but unlike RopeJoint it constrains the minimum as well.

Re-creating a RopeJoint every frame using a new length is rather inefficient, and I'm not even sure it would work properly in the simulation.

I could create a "chain" of bodies connected by RotationJoints but that is also less efficient, and less robust. I also wouldn't be able to change the length arbitrarily, but only by adding and removing a whole number of links, and it's not obvious how I would connect the remainder without violating existing joints.

This sounds like something that should be straightforward to do. Am I overlooking something?

Update: I don't care whether the rope is "deformable", i.e. whether it actually behaves like a rope, or whether it collides with other geometry. Just a straight rope will do. I can do graphical gimmicks while rendering; they don't need to exist inside the physics engine. I just want something a RopeJoint whose length I can change at will.

Thomas
  • 578
  • 4
  • 13

2 Answers2

3

Ok, I naively assumed that LibGDX wrapped all of Box2D, so this would be purely a Box2D problem.

It turns out that vanilla Box2D, at least in trunk, has a function called b2RopeJoint::SetMaxLength. I've added it and got a pull request merged within minutes. It is now available (and working) in LibGDX nightlies.

Thomas
  • 578
  • 4
  • 13
2

If you want a "deformable" rope, that isn't possible in box2d, as box2d is a rigid body physics engine; check soft body dynamics, I would sugest the Bullet library.

A "simpler" solution using box2d would be to "emulate" the variation of length by hiding some of the rope (with fixed length) outside the visible world / not drawing some of the rope.

schematics

This would work like pulling the top extremity (b) of the rope (c) up/downwards. I would add some static objects (a) so that the ninja doesn't escape the visible world for too long...

fableal
  • 270
  • 2
  • 16
  • Sorry, it seems my description still isn't clear. I don't care whether the rope is deformable; softbodies are overkill especially since I'm targeting a mobile platform. – Thomas Oct 17 '12 at 18:42
  • Your other idea is interesting, but I don't quite see how I would set this up using rigid bodies and joints. I could use a stick to simulate the rope, but it would constrain the distance between the ninja and attachment point to be constant, whereas I just want to constrain it to a maximum. – Thomas Oct 17 '12 at 18:43
  • I added the "deformable" only for completeness (you said you "didn't care", not that "didn't want" :P) – fableal Oct 17 '12 at 19:31