Vector3 FlightPosition(Vector3 targetPosition, float minAlt) { Vector3 forwardDirection = vesselTransform.up; Vector3 targetDirection = (targetPosition - vesselTransform.position).normalized; if (Vector3.Dot(targetDirection, forwardDirection) < 0) { targetPosition = vesselTransform.position + Vector3.RotateTowards(Vector3.ProjectOnPlane(forwardDirection, upDirection), Vector3.ProjectOnPlane(targetDirection, upDirection), 90 * Mathf.Deg2Rad, 0).normalized *200; } float pointRadarAlt = MissileGuidance.GetRaycastRadarAltitude(targetPosition); if (pointRadarAlt < minAlt) { float adjustment = (minAlt - pointRadarAlt); debugString += "\nTarget position is below minAlt. Adjusting by " + adjustment; return(targetPosition + (adjustment * upDirection)); } else { return(targetPosition); } }
void TakeOff(FlightCtrlState s) { threatLevel = 1; debugString += "\nTaking off/Gaining altitude"; if (vessel.Landed && vessel.srfSpeed < takeOffSpeed) { defaultOrbitCoords = VectorUtils.WorldPositionToGeoCoords(vessel.transform.position, vessel.mainBody); return; } steerMode = SteerModes.Aiming; float radarAlt = MissileGuidance.GetRadarAltitude(vessel); Vector3 forwardPoint = vessel.transform.position + Vector3.ProjectOnPlane(vesselTransform.up * 100, upDirection); float terrainDiff = MissileGuidance.GetRaycastRadarAltitude(forwardPoint) - radarAlt; terrainDiff = Mathf.Max(terrainDiff, 0); float rise = Mathf.Clamp((float)vessel.srfSpeed * 0.3f, 5, 100); if (radarAlt > 70) { vessel.ActionGroups.SetGroup(KSPActionGroup.Gear, false); } else { vessel.ActionGroups.SetGroup(KSPActionGroup.Gear, true); } FlyToPosition(s, forwardPoint + (upDirection * (rise + terrainDiff))); if (radarAlt > minAltitude) { startedLanded = false; } }
Vector3 GetTerrainSurfacePosition(Vector3 position) { return(position - (MissileGuidance.GetRaycastRadarAltitude(position) * upDirection)); }