PDA

View Full Version : Time-step independent friction model


TK
Jul22-04, 04:50 PM
Greetings , all fellow scientists!




I've been struggling with time-step independent physics for a programming project. The problem is that it doesn't seem to be time-step independent after all. Here's some of it in a pseudo-code form. It seems to be the friction part where it goes wrong. The reason I'm calculating friction like that anyway is because this way has a nice property of limiting the speed. ( Should implement surface friction and drag separately for better simulation though. ) The following gets executed at varying intervals. Hope the variable names are self-explanatory.

``calc acc vector without friction
acc_x = time_step * ( move_force_x / mass )
acc_y = time_step * ( move_force_y / mass )
acc_z = time_step * ( move_force_z / mass )

``calc movement vector without friction
move_x = time_step * ( speed_x + ( acc_x / 2 ) )
move_y = time_step * ( speed_y + ( acc_y / 2 ) )
move_z = time_step * ( speed_z + ( acc_z / 2 ) )

``calc and apply friction
move_force_x = move_force_x - ( move_x * friction_coefficient )
move_force_y = move_force_y - ( move_y * friction_coefficient )
move_force_z = move_force_z - ( move_z * friction_coefficient )


``calc acc vector
acc_x = time_step * ( move_force_x / mass )
acc_y = time_step * ( move_force_y / mass )
acc_z = time_step * ( move_force_z / mass )

``calc movement vector
move_x = time_step * ( speed_x + ( acc_x / 2 ) )
move_y = time_step * ( speed_y + ( acc_y / 2 ) )
move_z = time_step * ( speed_z + ( acc_z / 2 ) )

``calc new speed
speed_x = speed_x + acc_x
speed_y = speed_y + acc_y
speed_z = speed_z + acc_z

``calc new pos
pos_x = pos_x + move_x
pos_y = pos_y + move_y
pos_z = pos_z + move_z


And now in a shorter form joining the coordinates to vector-type variables. Could have only posted that one but then the variable names would have been less self-explanatory.

``calc acc vector without friction
V_acc = time_step * ( V_move_force / mass )

``calc movement vector without friction
V_move = time_step * ( V_speed + ( V_acc / 2 ) )

``calc and apply friction
V_move_force = V_move_force - ( V_move * friction_coefficient )


``calc acc vector
V_acc = time_step * ( V_move_force / mass )

``calc movement vector
V_move = time_step * ( V_speed + ( V_acc / 2 ) )

``calc new speed
V_speed = V_speed + V_acc

``calc new pos
V_pos = V_pos + V_move


Maybe it's more like a mathematical question but anyway it is wrong to separate those sciences. The physics are not complex here and that's why I thought it'd do with lesser explanation on what it is supposed to do and so on. In case the above is how it should be after all I'll take a look at the part where it calculates the time-step in the 1st place.
Thanks in advance!




All the best!


TK

Integral
Jul22-04, 04:58 PM
I do not see any way that your calculations can be time step independent, please provide more information about what you mean.

move_x = time_step * ( speed_x + ( acc_x / 2 ) )

This will not give you the correct position. You are adding a velocity to an acceleration, you need to do this:

move_x = time_{step} * (speed_x + (time_{step} * \frac {acc_x} 2))

to get a distance.

TK
Jul22-04, 05:11 PM
Hiya , Integral!


Thank You for a really fast reply! Thought I'd have to wait atleast until tomorrow morning.
Anyway , it should be a nice , little optimization. Follow the flow of the code...

``calc acc vector without friction
V_acc = time_step * ( V_move_force / mass )

``calc movement vector without friction
V_move = time_step * ( V_speed + ( V_acc / 2 ) )

...acceleration is premultiplied with time-step. Should of have made it clearer though and perhaps named the variable differently.

TK
Jul23-04, 02:37 AM
Had a mistype( typo ) there...

``calc and apply friction
move_force_X = move_force_x - ( move_x * friction_coefficient )
move_force_X = move_force_y - ( move_y * friction_coefficient )
move_force_X = move_force_z - ( move_z * friction_coefficient )

This is not the case with the real thing though.
So , has anyone got any ideas? Thank You!

TK
Jul26-04, 05:11 AM
Has anyone got any ideas?