Example #1
0
        private Vector3 AGMGuidance()
        {
            if (TargetingMode != TargetingModes.Gps)
            {
                if (TargetAcquired)
                {
                    //lose lock if seeker reaches gimbal limit
                    float targetViewAngle = Vector3.Angle(vessel.transform.forward, TargetPosition - vessel.CoM);

                    if (targetViewAngle > maxOffBoresight)
                    {
                        Debug.Log("[BDArmory]: AGM Missile guidance failed - target out of view");
                        guidanceActive = false;
                    }
                }
                else
                {
                    if (TargetingMode == TargetingModes.Laser)
                    {
                        //keep going straight until found laser point
                        TargetPosition = laserStartPosition + (20000 * startDirection);
                    }
                }
            }
            Vector3 agmTarget = MissileGuidance.GetAirToGroundTarget(TargetPosition, vessel, 1.85f);

            return(agmTarget);
        }
Example #2
0
        private Vector3 AAMGuidance()
        {
            Vector3 aamTarget;

            if (TargetAcquired)
            {
                float timeToImpact;
                aamTarget = MissileGuidance.GetAirToAirTargetModular(TargetPosition, TargetVelocity, previousTargetVelocity, TargetAcceleration, vessel, previousMissileVelocity, out timeToImpact);
                previousTargetVelocity  = TargetVelocity;
                previousMissileVelocity = vessel.Velocity();
                TimeToImpact            = timeToImpact;
                if (Vector3.Angle(aamTarget - vessel.CoM, vessel.transform.forward) > maxOffBoresight * 0.75f)
                {
                    Debug.LogFormat("[BDArmory]: Missile with Name={0} has exceeded the max off boresight, checking missed target ", vessel.vesselName);
                    aamTarget = TargetPosition;
                }
                DrawDebugLine(vessel.CoM, aamTarget);
            }
            else
            {
                aamTarget = vessel.CoM + (20 * vessel.srfSpeed * vessel.Velocity().normalized);
            }

            return(aamTarget);
        }
Example #3
0
        protected override void AutoPilot(FlightCtrlState s)
        {
            speedController.targetSpeed = speed;

            Vector3 targetDirection;

            if (MissileGuidance.GetRadarAltitude(vessel) < 500)
            {
                targetDirection = Quaternion.AngleAxis(75, vessel.transform.right) * VectorUtils.GetUpDirection(vessel.CoM);
                vessel.ActionGroups.SetGroup(KSPActionGroup.Gear, true);
            }
            else
            {
                if (targetVessel != null)
                {
                    targetDirection = targetVessel.CoM - vessel.CoM;
                }
                else
                {
                    Vector3 worldPos = vessel.mainBody.GetWorldSurfacePosition(assignedPositionGeo.x, assignedPositionGeo.y, 0);
                    targetDirection = worldPos + VectorUtils.GetUpDirection(worldPos) * ((float)vessel.mainBody.GetAltitude(worldPos) + 1500) - vessel.CoM;
                }
                vessel.ActionGroups.SetGroup(KSPActionGroup.Gear, false);
            }

            float pitchError = VectorUtils.SignedAngle(vessel.transform.up, Vector3.ProjectOnPlane(targetDirection, vessel.transform.right), -vessel.transform.forward);
            float yawError   = VectorUtils.SignedAngle(vessel.transform.up, Vector3.ProjectOnPlane(targetDirection, vessel.transform.forward), vessel.transform.right);
            float rollError  = VectorUtils.SignedAngle(-vessel.transform.forward, Vector3.ProjectOnPlane(Vector3.Angle(vessel.transform.up, targetDirection) > 7 ? targetDirection : VectorUtils.GetUpDirection(vessel.CoM), vessel.transform.up), vessel.transform.right);

            Vector3 localAngVel = vessel.angularVelocity;

            s.roll  = 0.04f * rollError - 1.2f * -localAngVel.y;
            s.pitch = 0.1f * pitchError - 3f * -localAngVel.x;
            s.yaw   = 0.03f * yawError - 0.6f * -localAngVel.z;
        }
Example #4
0
        void UpdateTarget()
        {
            slaved = false;

            if (weaponManager && wm.slavingTurrets && wm.CurrentMissile)
            {
                slaved = true;
                slavedTargetPosition = MissileGuidance.GetAirToAirFireSolution(wm.CurrentMissile, wm.slavedPosition,
                                                                               wm.slavedVelocity);
            }
        }
Example #5
0
 // Fire missile from each missile source on self
 public void FireMissiles(GameObject go = null)
 {
     for (int i = 0; i < missileBurst; i++)
     {
         GameObject      _missile     = Instantiate(data.missile, transform.position + transform.up, transform.rotation);
         MissileGuidance _misGuidance = _missile.GetComponent <MissileGuidance>();
         _misGuidance.crosshair = crosshair;
         _misGuidance.target    = go;
         _misGuidance.UpdateColliderIgnore(ignoreColliderList);
         if (i % 2 == 0)
         {
             _misGuidance.swirlSpeed *= -1;
             _misGuidance.thetaPos    = false;
         }
     }
 }
Example #6
0
    // Attract missile within collider radius
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Missile")
        {
            MissileGuidance _misGuidance = collision.GetComponent <MissileGuidance>();

            if (_misGuidance != null)
            {
                if (_misGuidance.target != null && _misGuidance.target.tag != "Flare")
                {
                    _misGuidance.ChangeTarget(gameObject);
                }
                else if (_misGuidance.target == null)
                {
                    _misGuidance.ChangeTarget(gameObject);
                }
            }
        }
    }
Example #7
0
        private Vector3 CruiseGuidance()
        {
            Vector3 cruiseTarget = Vector3.zero;
            float   distanceSqr  = (TargetPosition - vessel.CoM).sqrMagnitude;

            if (distanceSqr < 4500 * 4500)
            {
                cruiseTarget = MissileGuidance.GetAirToGroundTarget(TargetPosition, vessel, 1.85f);
                debugString.Append("Descending On Target");
                debugString.Append(Environment.NewLine);
            }
            else
            {
                cruiseTarget = MissileGuidance.GetCruiseTarget(TargetPosition, vessel, CruiseAltitude);
                debugString.Append("Cruising");
                debugString.Append(Environment.NewLine);
            }

            debugString.Append($"RadarAlt: {MissileGuidance.GetRadarAltitude(vessel)}");
            debugString.Append(Environment.NewLine);

            return(cruiseTarget);
        }
Example #8
0
        protected Vector3 CalculateAGMBallisticGuidance(MissileBase missile, Vector3 targetPosition)
        {
            //set up
            if (_originalDistance == float.MinValue)
            {
                _startPoint       = missile.vessel.CoM;
                _originalDistance = Vector3.Distance(targetPosition, missile.vessel.CoM);

                //calculating expected apogee bases on isosceles triangle
            }

            debugString.Append($"_originalDistance: {_originalDistance}");
            debugString.Append(Environment.NewLine);
            debugString.Append($"BallisticOverShootFactor: {BallisticOverShootFactor}");
            debugString.Append(Environment.NewLine);

            var surfaceDistanceVector = Vector3
                                        .Project((missile.vessel.CoM - _startPoint), (targetPosition - _startPoint).normalized);

            var pendingDistance = _originalDistance - surfaceDistanceVector.magnitude;

            debugString.Append($"pendingDistance: {pendingDistance}");
            debugString.Append(Environment.NewLine);

            if (TimeIndex < 1)
            {
                return(missile.vessel.CoM + missile.vessel.Velocity() * 10);
            }

            Vector3 agmTarget;

            // Getting apoapsis
            if (missile.vessel.verticalSpeed > 0 && pendingDistance > _originalDistance * 0.5)
            {
                debugString.Append($"Ascending");
                debugString.Append(Environment.NewLine);

                var freeFallTime = CalculateFreeFallTime();
                debugString.Append($"freeFallTime: {freeFallTime}");
                debugString.Append(Environment.NewLine);

                var horizontalTime = pendingDistance / missile.vessel.horizontalSrfSpeed;
                debugString.Append($"horizontalTime: {horizontalTime}");
                debugString.Append(Environment.NewLine);

                if (freeFallTime >= horizontalTime)
                {
                    debugString.Append($"Free fall achieved:");
                    debugString.Append(Environment.NewLine);

                    missile.Throttle = 0;
                    agmTarget        = missile.vessel.CoM + missile.vessel.Velocity() * 10;
                }
                else
                {
                    debugString.Append($"Free fall not achieved:");
                    debugString.Append(Environment.NewLine);

                    missile.Throttle = 1;
                    Vector3 dToTarget = targetPosition - missile.vessel.CoM;
                    Vector3 direction = Quaternion.AngleAxis(Mathf.Clamp(missile.maxOffBoresight * 0.9f, 0, 45f), Vector3.Cross(dToTarget, VectorUtils.GetUpDirection(missile.vessel.CoM))) * dToTarget;
                    agmTarget = missile.vessel.CoM + direction;
                }


                debugString.Append($"Throttle: {missile.Throttle}");
                debugString.Append(Environment.NewLine);
            }
            else
            {
                debugString.Append($"Descending");
                debugString.Append(Environment.NewLine);
                agmTarget = MissileGuidance.GetAirToGroundTarget(targetPosition, missile.vessel, 1.85f);

                if (missile is BDModularGuidance)
                {
                    if (missile.vessel.InVacuum())
                    {
                        agmTarget = missile.vessel.CoM + missile.vessel.Velocity() * 10;
                    }
                }
                missile.Throttle = Mathf.Clamp((float)(missile.vessel.atmDensity * 10f), 0.01f, 1f);
            }
            return(agmTarget);
        }