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); }
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); }
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; }
void UpdateTarget() { slaved = false; if (weaponManager && wm.slavingTurrets && wm.CurrentMissile) { slaved = true; slavedTargetPosition = MissileGuidance.GetAirToAirFireSolution(wm.CurrentMissile, wm.slavedPosition, wm.slavedVelocity); } }
// 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; } } }
// 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); } } } }
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); }
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); }