protected override void Apply() { if (IsDynamic(Object)) { IPhysicsObject physObj = (IPhysicsObject)Object; double d = (Object.Position - Center).ScalarProjection(Axis); double angularFreq = 2 * Math.PI * Frequency; double k = Math.Pow(angularFreq, 2) * physObj.Mass; double force = -k * d; double dampingForce = physObj.Velocity.ScalarProjection(Axis) * Damping * physObj.Mass; double totalForce = force - dampingForce; physObj.Push(totalForce * Axis); } else { Object.Position = Center + GetOffset(); } }
protected override void Apply() { if (IsDynamic(Object)) { IPhysicsObject physObj = (IPhysicsObject)Object; double d = (Object.Position - Center).ScalarProjection(Axis); double angularFreq = 2 * Math.PI * Frequency; double k = Math.Pow(angularFreq, 2) * physObj.Mass; double force = -k * d; double dampingForce = physObj.Velocity.ScalarProjection(Axis) * Damping * physObj.Mass; double totalForce = force - dampingForce; physObj.Push(totalForce * Axis); } else if (Object is PhysicsObject obj) { obj.Velocity = GetVelocity(); } else { Object.Position = Center + GetOffset(); } if (stopGradually) { double origDst = Vector.Distance(OriginalPosition, prevPos); double currDst = Vector.Distance(OriginalPosition, Object.Position); if (!distanceDecreasing && origDst > currDst) { distanceDecreasing = true; } if (distanceDecreasing && origDst < currDst) { Stop(true); } } prevPos = Object.Position; }
public void ShokkiaaltoOsuu(IPhysicsObject vihu, Vector Shokki) { vihu.Push(Shokki); ((Vihulainen)vihu).Vahingoita(Vahinko); }