- The first - and perhaps easiest - part of implementing any rigid body physics system is getting the entities in your scene to move in response to linear forces.
- With this implementation alone, you can achieve an interesting level of realism in your 2D (and even 3D) scene.
-
-
- Let's begin by recalling the relationships between acceleration, velocity, and position.
-
-
- Knowing all this, you should be able to understand the following source code fairly easily;
-
-
-function update(dtSeconds) {
- // Add up the forces acting on the circle
- const GRAVITY = 9.8;
- const lGravityForce = vec2(0, -1.0 * (lCircle.mass * GRAVITY));
- lCircle.force = addVec2(lCircle.force, lGravityForce);
-
- // Figure out acceleration (a = F / m)
- const lCurrentAcceleration = scaleVec2(lCircle.force, 1.0 / lCircle.mass);
-
- // Calculate the new velocity: v = v0 + a * t
- lCircle.velocity = addVec2(lCircle.velocity, scaleVec2(lCurrentAcceleration, dtSeconds));
-
- // Update the position based on velocity: x = x0 + v * t
- lCircle.position = addVec2(lCircle.position, scaleVec2(lCircle.velocity, dtSeconds));
-
- // Update the model matrix accordingly
- lCircle.model = translateMatrix(mat4(), lCircle.position.x, lCircle.position.y, 0);
-
- // Reset the force vector for the next update
- lCircle.force = vec2()
-}
-
-
-
-
-
-
-
-
Linear Force:N/A
-
Linear Acceleration:N/A
-
Linear Velocity:N/A
-
Linear Position:N/A
-
-
+
+
+
Part 1: Linear Forces
+
+ The first - and perhaps easiest - part of implementing any rigid body physics system is getting the entities in your scene to move in response to linear forces.
+ With this implementation alone, you can achieve an interesting level of realism in your 2D (and even 3D) scene.
+
+
+ Let's begin by recalling the relationships between acceleration, velocity, and position.
+
+
+ Knowing all this, you should be able to understand the following source code fairly easily;
+
+
+ function update(dtSeconds) {
+ // Add up the forces acting on the circle
+ const GRAVITY = 9.8;
+ const lGravityForce = vec2(0, -1.0 * (lCircle.mass * GRAVITY));
+ lCircle.force = addVec2(lCircle.force, lGravityForce);
+
+ // Figure out acceleration (a = F / m)
+ const lCurrentAcceleration = scaleVec2(lCircle.force, 1.0 / lCircle.mass);
+
+ // Calculate the new velocity: v = v0 + a * t
+ lCircle.velocity = addVec2(lCircle.velocity, scaleVec2(lCurrentAcceleration, dtSeconds));
+
+ // Update the position based on velocity: x = x0 + v * t
+ lCircle.position = addVec2(lCircle.position, scaleVec2(lCircle.velocity, dtSeconds));
+
+ // Update the model matrix accordingly
+ lCircle.model = translateMatrix(mat4(), lCircle.position.x, lCircle.position.y, 0);
+
+ // Reset the force vector for the next update
+ lCircle.force = vec2()
+ }
+
+