Puppet tool - how do I make the arms stay attached to the same points on the body?
If you put a puppet pin at the point where the arms attach, then you can tie the position of the arm layer to the position of the puppet pin using an expression. This will attach the layer to the puppet pin, allowing you to move the pin and the layer it is on and have the arm follow.

It's easy to do, with no knowledge of scripting really required.



So say your body layer is called "Body" and it has a puppet pin called "L_Shoulder", which is on the body at the point where you want to attach the left arm. The left arm layer should have its anchor point at the point that you want it to pivot on, which coresponds to the L_Shoulder on the body layer.



Here's what you do:


First, make the arm layer a child of the body.
Now apply an expression to its position property (hit alt/opt and click on the stopwatch). 


The expression we want is this:

thisComp.layer("Body").effect("Puppet").arap.mesh("Mesh 1").deform("L_Shoulder").position


This looks very difficult to type, but fortunately we don't have to. Next to the expression editor text box is a pickwhip, that we can use to select properties and values. After you alt/option-click the stopwatch, drag the pickwhip to the position property of the puppet pin, and it will fill it all in for you.



Because the puppet pin positions are relative to the layer this works well. As the arm is a parent of the child, setting its position relative to the body layer is exactly what you want.

If the arm is not a child of the body it gets much more complicated: you have to use the toComp method of the body layer to get the relative position of the pin to the composition space, and then you have to apply expressions to link the other transformation properties of the body layer, but it can be done.