def update(self, dt): """Updates the position and the velocity of the shell. Moves the shell based on it's current velocity and the time passed (`dt`). Updates the velocity based on `self.gravity`, `self.wind`, `self.drag_coef` and the time passed. Args: dt: Delta t, the change of time the shell should be updated by. """ # move the shell based on the current velocity and change of time self.center = Vector(*self.center) + Vector(*self.velocity) * dt # apply gravitational acceleration self.velocity_y -= self.gravity * dt air_vel = Vector(self.velocity_x - self.wind, self.velocity_y) # based on https://en.wikipedia.org/wiki/Drag_equation # hides the density, area and other constants for the shell into the drag coefficient drag = air_vel.normalize() * self.drag_coef * air_vel.length2() vel_vec = Vector(*self.velocity) - (drag / self.mass) self.velocity = (vel_vec.x, vel_vec.y) # bounce off the walls if (self.x < 0) or (self.right > self.parent.width): self.velocity_x *= -1 self.right = clamp(self.right, 0, self.parent.width) self.x = clamp(self.x, 0, self.parent.width) if self.top > self.parent.height: self.velocity_y *= -1 self.top = clamp(self.top, 0, self.parent.height)
def gravitate_towards(self, body): velocity_v = Vector(self.velocity) gravity_v = Vector(body.pos) - Vector(self.pos) self.velocity = velocity_v + \ (gravity_v * 1. / gravity_v.length2()) * body.mass
def gravitate_towards(self, body): velocity_v = Vector(self.velocity) gravity_v = Vector(body.pos) - Vector(self.pos) self.velocity = velocity_v + (gravity_v * 1.0 / gravity_v.length2()) * body.mass