[ad_1]
Your pseudo code makes use of non customary notation (you appear to be utilizing project within the <=
comparability expressions, that’s actually complicated), which is makes it arduous to learn, however If I perceive the difficulty accurately, its that there’s some confusion with friction.
Friction in actual life is brought on by microscopic perturbations within the floor of a aircraft an object is standing on, characterised by a friction coefficient for simplicity sake eg: u
. The magnitude of the drive of friction is that this (see wikipedia for an illustration):
friction_magnitude = u * magnitude(force_anti_normal_to_friction_plane);
A aircraft could be arbitrarily oriented, not simply flat horizontal. However see that we use force_anti_normal_to_friction_plane
and in your equations, you seem to solely care in regards to the acceleration as a result of gravity, when the drive equation is definitely F = M*A
. The mass is accounted for within the drive of friction. On this method your friction magnitude assuming gravity is the one drive regular to the aircraft of friction ought to be:
friction_magnitude = u * magnitude(G * mass);
You then take this and multiply it with the a part of the speed parallel to the aircraft of friction, for a horizontal aircraft that is simply your non vertical parts (in my system that is usually x, and z) normalized.
friction_force = -u * magnitude(G * mass) * normalize(vec3(velocity.x, 0.0, velocity.z));
Within the case the place you could have an arbitrarily oriented friction aircraft it’s the rejection of the speed vector with the conventional of the aircraft which incorporates the parts which to normalize, and the projection of the drive to determine what parts of the drive truly apply to the aircraft of friction. This rejection incorporates the orthogonal vector to the conventional of the aircraft, which incorporates the parallel velocity element to the aircraft, the projection incorporates the parts parallel to the the given vector.
// want to ensure that the forces are not less than pointing in direction of the aircraft
// and never away, if forces don't level in direction of aircraft, then there isn't a
// drive anti regular to the aircraft of friction urgent right down to trigger contact
if(dot(forces,friction_normal) < 0.0){
force_anti_normal_to_friction_plane = projection(drive, friction_normal);
}else{
force_anti_normal_to_friction_plane = 0.0;
}
friction_force = -u * magnitude(force_anti_normal_to_friction_plane) * normalize(reject(velocity, friction_normal));
One other factor that you must be careful with dynamic friction is that you do not wish to apply it previous when the thing would have stopped shifting within the parallel velocity to the aircraft. Ie you probably have a really tiny vector shifting throughout the ground of your friction aircraft, friction does not scale much less due to that, and doing a naive calculation would trigger your velocity vector to maneuver forwards and backwards endlessly throughout the aircraft. You must halt your motion alongside that vector to adequately deal with this case. In otherwords, if the magnitude of your velocity alongside the aircraft of friction is lower than the magnitude of velocity change contributed soley by the drive of friction that you must cease shifting!. To do that for arbitrary orientations of the friction aircraft, take the speed parts rejected by the conventional and subtract them from the speed to cancel out that motion.
[ad_2]