summaryrefslogtreecommitdiff
path: root/2d/rigidbody/rigidbody_1/snippet3.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2d/rigidbody/rigidbody_1/snippet3.cpp')
-rw-r--r--2d/rigidbody/rigidbody_1/snippet3.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/2d/rigidbody/rigidbody_1/snippet3.cpp b/2d/rigidbody/rigidbody_1/snippet3.cpp
index a43c884..4727a9a 100644
--- a/2d/rigidbody/rigidbody_1/snippet3.cpp
+++ b/2d/rigidbody/rigidbody_1/snippet3.cpp
@@ -17,24 +17,26 @@ struct Rigidbody {
void update(float32 deltaTimeSeconds) {
applyGravity(deltaTimeSeconds);
- // Add up all of the forces acting at this moment
Vector2 force;
for (int32 idx = 0; idx < numImpulses; idx++) {
Impulse& i = activeImpulses[idx];
float32 nextTimeAppliedSeconds = i.timeAppliedSeconds + deltaTimeSeconds;
if (nextTimeAppliedSeconds >= i.timeOfApplicationSeconds) {
- nextTimeAppliedSeconds = i.timeOfApplicationSeconds;
+ nextTimeAppliedSeconds = i.timeOfApplicationSeconds; // Do the remainder of the time
i.isDead = true;
}
+ // We apply the force spread out over timeOfApplicationSeconds, so we need
+ // to calculate the fractional amount of force that was applied in this frame.
float32 impulseDtSeconds = nextTimeAppliedSeconds - i.timeAppliedSeconds;
- force += i.force * impulseDtSeconds;
+ Vector2 forceToApply = i.force * (impulseDtSeconds / i.timeOfApplicationSeconds);
+ force += forceToApply * impulseDtSeconds;
i.timeAppliedSeconds = nextTimeAppliedSeconds;
}
Vector2 acceleration = force / mass;
- velocity += (acceleration * impulseDtSeconds);
+ velocity += (acceleration * deltaTimeSeconds);
position += (velocity * deltaTimeSeconds);
// Cleanup any impulses that have expired in the mean time