class Projectile: def __init__(self): self.velocity = Vector(15.0, 15.0, 1.0) self.position = Vector(0.0, 0.1, 0.0) self.acceleration = Vector(0.0, 0.0, 0.0) self.windVelocity = Vector(0.0, 0.0, 0.0) self.radius = 0.5 self.dragCoeff = 0.5 self.windDragCoeff = 0.5 self.mass = 10.0 self.liftCoeff = 0.2 self.velocityThreshold = 2.0 self.spin = Vector(0.0, 0.0, 1.0) # Moment of Inertia def calcMomentInertia(self): return (2.0 / 5.0) * self.mass * self.radius * self.radius # Drag Force def calcForceDrag(self): apparentVelocity = self.velocity - self.windVelocity return (apparentVelocity * apparentVelocity) * 0.5 * self.calcDensity() * self.calcArea() * -self.dragCoeff # Gravitational Force def calcForceGravity(self): return Vector(0.0, -1.0, 0.0) * (self.mass * G) # Density def calcDensity(self): return self.mass / ((4.0 / 3.0) * PI * self.radius * self.radius * self.radius) # Magnus Force def calcMagnusForce(self): return (self.calcRotationVelocity().cross(self.velocity)) * self.spin # Torque def calcTorque(self): return self.calcTotalForce().cross(self.position + self.radius) # Rotational Velocity def calcRotationVelocity(self): rad = self.velocity.normalize() * self.radius return (rad).cross(velocity) / (rad.magnitude() * rad.magnitude()) # Area def calcArea(self): return PI * self.radius * self.radius # Total Force def calcTotalForce(self): return self.calcForceDrag() + self.calcForceGravity() + self.calcMagnusForce()