Browse Source

Drag & Friction: Adding friction

Godzil 1 year ago
parent
commit
5dbaa4faab
4 changed files with 15 additions and 22 deletions
  1. 2 20
      source/app.cpp
  2. 0 2
      source/include/app.h
  3. 1 0
      source/include/physics/force.h
  4. 12 0
      source/physics/force.cpp

+ 2 - 20
source/app.cpp

@@ -31,12 +31,6 @@ void application::setup()
 
     this->particles.push_back(new particle(50, 100, 1.0, 4));
     this->particles.push_back(new particle(200, 100, 3.0, 12));
-
-    this->liquid.x = 0;
-    this->liquid.y = graphics::height() / 2;
-    this->liquid.w = graphics::width();
-    this->liquid.h = graphics::height() / 2;
-
 }
 
 void application::input()
@@ -114,24 +108,16 @@ void application::syncAndDeltatime()
 
 void application::update()
 {
-    vec2 wind = vec2(0.2 * PIXELS_PER_METER, 0);
-    vec2 weight = vec2(0, 9.81 * PIXELS_PER_METER);
     this->syncAndDeltatime();
 
     updateTime.start();
 
     for (auto part:this->particles)
     {
-        //part->addForce(wind);
         part->addForce(this->pushForce);
-        part->addForce(weight * part->mass);
 
-        // Apply drag if in liquid.
-        if (part->position.y >= this->liquid.y)
-        {
-            vec2 drag = force::generateDragForce(*part, 0.01);
-            part->addForce(drag);
-        }
+        vec2 friction = force::generateFrictionForce(*part, 10 * PIXELS_PER_METER);
+        part->addForce(friction);
 
         part->integrate(deltaTime);
 
@@ -176,10 +162,6 @@ void application::render()
 
     graphics::clearScreen(0xFF056263);
 
-    // Draw the liquid
-    graphics::draw::fillRect(this->liquid.x + this->liquid.w / 2, this->liquid.y + this->liquid.h / 2,
-                             this->liquid.w, this->liquid.h, 0xFF633713);
-
     for (auto part:this->particles)
     {
         graphics::draw::fillCircle(part->position.x, part->position.y, part->radius, 0xFFFFFFFF);

+ 0 - 2
source/include/app.h

@@ -28,8 +28,6 @@ private:
 
     vec2 pushForce = vec2(0, 0);
 
-    SDL_Rect liquid;
-
 public:
     application() : running(false) {};
     ~application() = default;

+ 1 - 0
source/include/physics/force.h

@@ -16,6 +16,7 @@
 class force
 {
 public:
+    static vec2 generateFrictionForce(const particle &particleRef, double k);
     static vec2 generateDragForce(const particle &particleRef, double k);
 };
 

+ 12 - 0
source/physics/force.cpp

@@ -22,4 +22,16 @@ vec2 force::generateDragForce(const particle &particleRef, double k)
     }
 
     return dragForce;
+}
+
+vec2 force::generateFrictionForce(const particle &particleRef, double k)
+{
+    vec2 frictionForce;
+
+    vec2 frictionDirection = particleRef.velocity.unitVector() * -1;
+    double frictionMagnitude = k;
+
+    frictionForce = frictionDirection * frictionMagnitude;
+
+    return frictionForce;
 }