Jump to content

  • Log In with Google      Sign In   
  • Create Account


#ActualL. Spiro

Posted 08 November 2012 - 07:52 AM

Since we are only operating on joints and we assume them to be infinitely small (there is only one place on it we can apply any given force—this is unlike a box where applying a force to one of its corners almost always results in a different result from applying the same force to its center of mass) we don’t need to worry about where the impulse is applied in relation to the center of the joint. That simplifies things greatly.

Also we assume a fixed-interval time step here so that we can know the amount of time that will pass during the next update, because it is in that time that we want to reach the destination position.

So, for an infinitely small point with some mass, given an impulse over a given amount of time, the point will move by this much:
(F/M)*t
Where F is a force vector (and is 3D), t is time, and M is the mass of the object. Usually physics simulations store the inverse mass in order to avoid a division, and we are of course not accounting for friction or damping here (no need).

So you know where you are, you know where you want to be, you know your mass, and the amount of time you want it to take to get to the target.
D = 3D vector from starting point to end point.
D / t = How long it would take an object whose mass is 1 to get there in the given amount of time.
So if you have double the mass you need to apply double the force.
F = M * (D / t)


Of course you can then put a limit on F to make sure the arm (or whatever) doesn’t just jump to the target spot immediately, and this cap can be variable depending on how far away the target position is.
And all these equations should be done in joint-local space, otherwise you would have the hand trying to fly forward really fast when actually the rotation only involves the shoulder joint.
Convert the forces to world space afterwards.


L. Spiro

#3L. Spiro

Posted 08 November 2012 - 03:02 AM

Since we are only operating on joints and we assume them to be infinitely small (there is only one place on it we can apply any given force—this is unlike a box where applying a force to one of its corners almost always results in a different result from applying the same force to its center of mass) we don’t need to worry about where the impulse is applied in relation to the center of the joint. That simplifies things greatly.

Also we assume a fixed-interval time step here so that we can know the amount of time that will pass during the next update, because it is in that time that we want to reach the destination position.

So, for an infinitely small point with some mass, given an impulse over a given amount of time, the point will move by this much:
(F/M)*t
Where F is a force vector (and is 3D), t is time, and M is the mass of the object. Usually physics simulations store the inverse mass in order to avoid a division, and we are of course not accounting for friction or damping here (no need).

So you know where you are, you know where you want to be, you know your mass, and the amount of time you want it to take to get to the target.
D = 3D vector from starting point to end point.
D / t = How long it would take an object whose mass is 1 to get there in the given amount of time.
So if you have double the mass you need to apply double the force.
F = M * (D / t)


Of course you can then put a limit on F to make sure it the arm (or whatever) doesn’t just jump to the target spot immediately, and this cap can be variable depending on how far away the target position is.
And all these equations should be done in joint-local space, otherwise you would have the hand trying to fly forward really fast when actually the rotation only involves the shoulder joint.
Convert the forces to world space afterwards.


L. Spiro

#2L. Spiro

Posted 08 November 2012 - 03:02 AM

Since we are only operating on joints and we assume them to be infinitely small (there is only one place on it we can apply any given force—this is unlike a box where applying a force to one of its corners almost always results in a different result from applying the same force to its center of mass) we don’t need to worry about where the impulse is applied in relation to the center of the joint. That simplifies things greatly.

Also we assume a fixed-interval time step here so that we can know the amount of time that will pass during the next update, because it is in that time that we want to reach the destination position.

So, for an infinitely small point with some mass, given an impulse over a given amount of time, the point will move by this much:
(F/M)*t
Where F is a force vector (and is 3D), t is time, and M is the mass of the object. Usually physics simulations store the inverse mass in order to avoid a division, and we are of course not accounting for friction or damping here (no need).

So you know where you are, you know where you want to be, you know your mass, and the amount of time you want it to take to get to the target.
D = 3D vector from starting point to end point.
D / t = How long it would take an object whose mass is 1 to get there in the given amount of time.
So if you have double the mass you need to apply double the force.
F = M * (D / t)


Of course you can then put a limit on F to make sure it the arm (or whatever) doesn’t just jump to the target spot immediately, and this cap can be variable depending on how far away the target position is.
And all these equations should be done in joint-local space, otherwise you would have the hand trying to fly forward really fast when actually the rotation only involves the shoulder joint.
Convert the forces to world space afterwards.


L. Spiro

#1L. Spiro

Posted 08 November 2012 - 02:59 AM

Since we are only operating on joints and we assume them to be infinitely small (there is only one place on it we can apply any given force—this is unlike a box where applying a force to one of its corners almost always results in a different result from applying the same force to its center of mass) we don’t need to worry about where the impulse is applied in relation to the center of the joint. That simplifies things greatly.

Also we assume a fixed-interval time step here so that we can know the amount of time that will pass during the next update, because it is in that time that we want to reach the destination position.

So, for an infinitely small point with some mass, given an impulse over a given amount of time, the point will move by this much:
(F/M)*t
Where F is a force vector (and is 3D), t is time, and M is the mass of the object. Usually physics simulations store the inverse mass in order to avoid a division, and we are of course not accounting for friction or damping here (no need).

So you know where you are, you know where you want to be, you know your mass, and the amount of time you want it to take to get to the target.
D = 3D vector from starting point to end point.
D / t = How long it would take an object whose mass is 1 to get there in the given amount of time.
So if you have double the mass you need to apply double the force.
F = M * (D / t)


L. Spiro

PARTNERS