public override void Update(double dt) { base.Update(dt); foreach (GridFin gridFin in _gridFins) { gridFin.Update(dt); } foreach (LandingLeg landingLeg in _landingLegs) { landingLeg.Update(dt); } DVector2 velocity = GetRelativeVelocity(); double altitude = GetRelativeAltitude(); DVector2 normalizedVelocity = velocity.Clone(); normalizedVelocity.Normalize(); DVector2 rotation = new DVector2(Math.Cos(Pitch), Math.Sin(Pitch)); // If we are going retro-grade and firing rockets adds soot if (altitude < 70000 && normalizedVelocity.Dot(rotation) < 0 && velocity.Length() > 400) { foreach (IEngine engine in Engines) { if (engine.IsActive && engine.Throttle > 0) { _sootRatio = Math.Min(_sootRatio + 0.015 * dt, 1.0); } } } }
public void Update(TimeStep timeStep, DVector2 enginePosition, DVector2 shipVelocity, double rotation, double throttle, double ispMultiplier, double angle = 0) { if (angle != 0) { _angle = angle; } double retrograde = rotation + Math.PI + _angle; int particles = (int)((throttle * _particleRate) / timeStep.UpdateLoops); // Interpolate between spreads based on ISP double spreadMultiplier = (1.0 - ispMultiplier) * _minSpread + ispMultiplier * _maxSpread; double throttleMultiplier = Math.Max(throttle, 0.3) * 0.01; // Add new particles if nessecary for (int i = 0; i < particles; i++) { if (_availableParticles.Count > 0) { double velocityFactor = _random.Next(200, 300) * throttleMultiplier; double spread = _random.NextDouble() - 0.5; DVector2 velocity = DVector2.FromAngle(retrograde + spread * spreadMultiplier); int id = _availableParticles.Dequeue(); Particle particle = _particles[id]; particle.IsActive = true; particle.Age = 0; particle.MaxAge = _random.NextDouble() * 0.05 + _maxAge; particle.Position = enginePosition.Clone(); particle.Velocity = shipVelocity.Clone() + velocity * velocityFactor; } } // Update the particles for (int i = 0; i < _particles.Length; i++) { Particle particle = _particles[i]; if (particle.IsActive) { particle.Position += particle.Velocity * timeStep.Dt; particle.Age += timeStep.Dt; if (particle.Age > particle.MaxAge) { particle.IsActive = false; _availableParticles.Enqueue(i); } } } }
public void Update(TimeStep timeStep, DVector2 shipPosition, DVector2 shipVelocity, double pitch, double heatingRate) { double rotation = pitch - _offsetAngle; DVector2 offset = new DVector2(Math.Cos(rotation), Math.Sin(rotation)) * _offsetLength; DVector2 shockPosition = shipPosition - offset; double normalizedHeating = Math.Max((heatingRate - 500000) * 0.0005, 0); int particles = (int)(normalizedHeating * _particleRate) / timeStep.UpdateLoops; // Add new particles if nessecary for (int i = 0; i < particles; i++) { if (_availableParticles.Count > 0) { double velocityFactor = _random.Next(50, 200); double spread = _random.NextDouble() * 2.5 - 1.25; DVector2 velocity = DVector2.FromAngle(rotation + spread); int id = _availableParticles.Dequeue(); Particle particle = _particles[id]; particle.IsActive = true; particle.Age = 0; particle.MaxAge = _random.NextDouble() * 0.01 + 0.02; particle.Position = shockPosition.Clone(); particle.Velocity = shipVelocity.Clone() + velocity * velocityFactor; } } // Update the particles for (int i = 0; i < _particles.Length; i++) { Particle particle = _particles[i]; if (particle.IsActive) { particle.Position += particle.Velocity * timeStep.Dt; particle.Age += timeStep.Dt; if (particle.Age > particle.MaxAge) { particle.IsActive = false; _availableParticles.Enqueue(i); } } } }
public void Update(TimeStep timeStep, DVector2 enginePosition, DVector2 shipVelocity, double rotation, double throttle, double ispMultiplier, double angle = 0) { if (angle != 0) { _angle = angle; } _retrograde = rotation + Math.PI + _angle; _throttle = throttle; _position = enginePosition.Clone(); }
public void Update(TimeStep timeStep, DVector2 enginePosition, DVector2 shipVelocity, DVector2 retrogradeVelocity, double density, double sootRatio) { int particles = (int)((sootRatio * shipVelocity.Length() * 0.001) / timeStep.UpdateLoops); if (density < 0.2 || density > 0.7) { particles = 0; } // Add new particles if nessecary for (int i = 0; i < particles; i++) { if (_availableParticles.Count > 0) { var randomUnitVector = new DVector2(_random.NextDouble(), _random.NextDouble()); DVector2 velocity = shipVelocity.Clone(); int id = _availableParticles.Dequeue(); Particle particle = _particles[id]; particle.IsActive = true; particle.Age = 0; particle.MaxAge = _random.NextDouble() + 1; particle.Position = enginePosition.Clone() + randomUnitVector * 2; particle.Velocity = velocity + retrogradeVelocity * 0.5 + randomUnitVector * 2; } } // Update the particles for (int i = 0; i < _particles.Length; i++) { Particle particle = _particles[i]; if (particle.IsActive) { particle.Position += particle.Velocity * timeStep.Dt; particle.Age += timeStep.Dt; if (particle.Age > particle.MaxAge) { particle.IsActive = false; _availableParticles.Enqueue(i); } } } }
public void Update(TimeStep timeStep, DVector2 enginePosition, DVector2 shipVelocity, double rotation, double throttle) { double retrograde = rotation + Math.PI; int particles = (int)((throttle * _particleRate) / timeStep.UpdateLoops); // Add new particles if nessecary for (int i = 0; i < particles; i++) { if (_availableParticles.Count > 0) { double velocityFactor = _random.Next(150, 250); double spread = _random.NextDouble() - 0.5; DVector2 velocity = DVector2.FromAngle(retrograde + spread * _spreadFactor); int id = _availableParticles.Dequeue(); Particle particle = _particles[id]; particle.IsActive = true; particle.Age = 0; particle.MaxAge = _random.NextDouble() * 0.1 + 0.05; particle.Position = enginePosition.Clone(); particle.Velocity = shipVelocity.Clone() + velocity * velocityFactor; } } // Update the particles for (int i = 0; i < _particles.Length; i++) { Particle particle = _particles[i]; if (particle.IsActive) { particle.Position += particle.Velocity * timeStep.Dt; particle.Age += timeStep.Dt; if (particle.Age > particle.MaxAge) { particle.IsActive = false; _availableParticles.Enqueue(i); } } } }
public override DVector2 GetInertialVelocity() { return(_cachedInertialVelocity.Clone()); }
/// <summary> /// Gets the relative velocity of the spacecraft. If the space craft is within the parent's /// atmosphere than the rotation of the planet is taken in account. Otherwise its a simple difference of velocities. /// </summary> public override DVector2 GetRelativeVelocity() { return(_cachedRelativeVelocity.Clone()); }