예제 #1
0
        // Interpolate between current and target orientation over the duration
        public override void Update(double elapsedTime, SpaceCraftBase spaceCraft)
        {
            double altitude         = spaceCraft.GetRelativeAltitude();
            double atmosphereheight = spaceCraft.GravitationalParent.AtmosphereHeight;

            DVector2 retrograde = spaceCraft.GetRelativeVelocity();

            if (altitude > atmosphereheight)
            {
                retrograde = spaceCraft.GetInertialVelocity();
            }

            retrograde.Negate();
            retrograde.Normalize();

            double retrogradeAngle = retrograde.Angle();

            double adjustRatio = (elapsedTime - StartTime) / _adjustmentTime;

            if (adjustRatio > 1)
            {
                spaceCraft.SetPitch(retrogradeAngle);
            }
            else
            {
                double interpolatedAdjust = MathHelper.LerpAngle(_curentOrientation, retrogradeAngle, adjustRatio);

                spaceCraft.SetPitch(interpolatedAdjust);
            }
        }
예제 #2
0
        public override void UpdateAnimations(TimeStep timeStep)
        {
            DVector2 retrogradeVelocity = GetRelativeVelocity();

            retrogradeVelocity.Negate();

            DVector2 engineBase = Position - DVector2.FromAngle(Pitch) * Height * 0.5;

            double altitude = GetRelativeAltitude();

            double atmosphericDensity = GravitationalParent.GetAtmosphericDensity(altitude);

            _engineSmoke.Update(timeStep, engineBase, Velocity, retrogradeVelocity, atmosphericDensity, _sootRatio);

            base.UpdateAnimations(timeStep);
        }
예제 #3
0
        public virtual void Update(double dt)
        {
            ElapsedTime += dt;

            if (IsPrograde)
            {
                DVector2 prograde = SpaceCraft.GetRelativeVelocity();
                prograde.Normalize();

                SpaceCraft.SetRotation(prograde.Angle());
            }

            if (IsRetrograde)
            {
                DVector2 retrograde = SpaceCraft.GetRelativeVelocity();
                retrograde.Negate();
                retrograde.Normalize();

                SpaceCraft.SetRotation(retrograde.Angle());
            }
        }
예제 #4
0
        // Interpolate between current and target orientation over the duration
        public override void Update(double elapsedTime, SpaceCraftBase spaceCraft)
        {
            DVector2 retrograde = spaceCraft.GetRelativeVelocity();

            retrograde.Negate();
            retrograde.Normalize();

            double retrogradeAngle = retrograde.Angle();

            double adjustRatio = (elapsedTime - StartTime) / _adjustmentTime;

            if (adjustRatio > 1)
            {
                spaceCraft.SetPitch(retrogradeAngle);
            }
            else
            {
                double interpolatedAdjust = MathHelper.LerpAngle(_curentOrientation, retrogradeAngle, adjustRatio);

                spaceCraft.SetPitch(interpolatedAdjust);
            }
        }
예제 #5
0
        // Interpolate between current and target orientation over the duration
        public override void Update(double elapsedTime, ISpaceCraft spaceCraft)
        {
            DVector2 retrograde = spaceCraft.GetRelativeVelocity();

            retrograde.Negate();
            retrograde.Normalize();

            double retrogradeAngle = retrograde.Angle();

            double adjustRatio = (elapsedTime - StartTime) / _adjustmentTime;

            if (adjustRatio > 1)
            {
                spaceCraft.SetRotation(retrogradeAngle);
            }
            else
            {
                double interpolatedAdjust = _curentOrientation * (1 - adjustRatio) + retrogradeAngle * adjustRatio;

                spaceCraft.SetRotation(interpolatedAdjust);
            }
        }