- #1
TK
- 5
- 0
Help with Friction
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.
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.
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
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.
Code:
``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.
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 ) )
``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
Last edited: