# Rope simulation with Position Based Dynamics

First off I apologize if this is the wrong stack exchange for this question, it seems to be like halfway between programming and math. But it leans more on the math side so hopefully I'm not out of place. I also apologize if this is long winded.

I'm referring to this paper which in turn references this other paper to create thread / rope simulations that run in real time.

In Müller's paper he talks about constraint functions being $C_j:\mathbb{R}^{3nj} \rightarrow \mathbb{R}$ Which makes sense because using the constraint solver you solve attempt to get each constraint function either equal to 0 or greater than or equal to 0.

However if you look at fratarcangeli's paper he gives the contact constraint function as $C(p) = [p - (p_{n0} + p_v)]$ Where $p$ must be some vertex of the rope, $p_v$ is the penetration vector and $p_{n0}$ is "the current position of point $p$". This is where things stop making sense for me. Because it appears that fratarcangeli's constraint equation is in $\mathbb{R}^3$ and not $\mathbb{R}$. Perhaps I'm miss-understanding the equation?

My second issue with his constraint function is $p_v = (\|p_{n0} - p_{n1}\| - r)\cdot\frac{p_{n0} - p_{n1}}{\|p_{n0} - p_{n1}\|}$ according to the diagram in the paper it looks like $p_{n0}$ and $p_{n1}$ are the two "closest points" of the two linesegments in the two capsule shapes. But he also says $p_{n0}$ is "the current position of point $p$". Though he never tells us what p should be with respect to the colliding capsules.

Perhaps someone can explain what his constraint function is supposed to be?

I attempted to figure out what the constraint function should be, forgive me I'm not incredibly mathematically strong.

I assumed if two segments were colliding I would have to apply a contact constraint to all 4 points. Since I'm applying the constraint to both sides I only need to move each mass point halfway out of the collision.

When a collision occurs between two line segments $\overline{p_1q_1}$ and $\overline{p_2q_2}$ And $p = p1$. I get the two closest points $c_1$ and $c_2$ on those segments respectively.Most of the time $c_1 \neq p$. So I have to define my constraint function with that in mind.

I call the collision normal $n = \frac{c_1 - c_2}{\|c_1 - c_2\|}$ and an offset $o = (p - c_1)\cdot n$ which is the offset along the collision normal of $p$ down to the contact point. This handles when $c_1 \neq p$ Note: $o$ is calculated once at the beginning of a collision, it's expected to stay constant.

The goal is to have the constraint function equal to 0 when $p$ has moved halfway to resolve the collision (the other segment will move the other half) and $>$ 0 when the point has moved further than halfway.

So I define $C(p) = -\frac{2r - ((p - c_2)\cdot n - o)}{2}$

Here's a poorly drawn diagram to illustrate my thoughts. http://i.imgur.com/rL4rU43.png (MO wouldn't let me put it in an image tag.)

(Image added by J.O'Rourke)

Which when I punch that through the method described in Müller's paper. I get $\Delta p = -2C(p)n$ However when I plug this into my simulation it's stable up until I tie a knot which given the nature of the papers means I've done something wrong. Can anyone elaborate on where I'm going wrong?

P.S. I'm not incredibly familiar with all the math so my tags could be way off, again apologies.

-
Thanks for the image assist. –  Tocs Jun 13 '13 at 5:06