/// <summary> /// calculate current heading from plane normal vector /// </summary> public static double CalculateTargetHeading(Vector3 direction, AsstVesselModule avm) { var fwd = Vector3.Cross(direction, avm.vesselData.planetUp); double heading = Vector3.Angle(fwd, avm.Vessel.north) * Math.Sign(Vector3.Dot(fwd, avm.Vessel.east)); return(heading.HeadingClamp(360)); }
/// <summary> /// calculate current heading from plane rotation /// </summary> public static double calculateTargetHeading(Quaternion rotation, AsstVesselModule avm) { Vector3 fwd = Vector3.Cross(getPlaneNormal(rotation, avm), avm.vesselData.planetUp); double heading = Vector3.Angle(fwd, avm.vesselData.planetNorth) * Math.Sign(Vector3.Dot(fwd, avm.vesselData.planetEast)); return(heading.headingClamp(360)); }
public void removeVessel(AsstVesselModule avm) { if (avm.vesselRef != controlledVessels[selectedVesselIndex].vesselRef) { Vessel ves = controlledVessels[selectedVesselIndex].vesselRef; controlledVessels.Remove(avm); selectedVesselIndex = controlledVessels.FindIndex(vm => vm.vesselRef == ves); } else { controlledVessels.RemoveAt(selectedVesselIndex); selectedVesselIndex = 0; } }
public static double SpeedTransform(SpeedRef refMode, AsstVesselModule avm) { switch (refMode) { case SpeedRef.Indicated: double stagnationPres = Math.Pow(((avm.vesselRef.mainBody.atmosphereAdiabaticIndex - 1) * avm.vesselRef.mach * avm.vesselRef.mach * 0.5) + 1, avm.vesselRef.mainBody.atmosphereAdiabaticIndex / (avm.vesselRef.mainBody.atmosphereAdiabaticIndex - 1)); return(Math.Sqrt(avm.vesselRef.atmDensity / 1.225) * stagnationPres); case SpeedRef.Equivalent: return(Math.Sqrt(avm.vesselRef.atmDensity / 1.225)); case SpeedRef.True: default: return(1); } }
public void RemoveVessel(AsstVesselModule avm) { if (selectedVesselIndex >= controlledVessels.Count) { return; } if (avm.Vessel != controlledVessels[selectedVesselIndex].Vessel) { Vessel ves = controlledVessels[selectedVesselIndex].Vessel; controlledVessels.Remove(avm); selectedVesselIndex = controlledVessels.FindIndex(vm => vm.Vessel == ves); } else { controlledVessels.RemoveAt(selectedVesselIndex); selectedVesselIndex = 0; } }
public void addVessel(AsstVesselModule avm) { controlledVessels.Add(avm); }
public void removeVessel(AsstVesselModule avm) { if (selectedVesselIndex >= controlledVessels.Count) return; if (avm.Vessel != controlledVessels[selectedVesselIndex].Vessel) { Vessel ves = controlledVessels[selectedVesselIndex].Vessel; controlledVessels.Remove(avm); selectedVesselIndex = controlledVessels.FindIndex(vm => vm.Vessel == ves); } else { controlledVessels.RemoveAt(selectedVesselIndex); selectedVesselIndex = 0; } }
/// <summary> /// Plane normal vector from a given heading (surface right vector) /// </summary> public static Vector3 vecHeading(double target, AsstVesselModule avm) { double angleDiff = target - avm.vesselData.heading; return(Quaternion.AngleAxis((float)(angleDiff + 90), (Vector3)avm.vesselData.planetUp) * avm.vesselData.surfVesForward); }
public static Vector3 getPlaneNormal(Quaternion rotation, AsstVesselModule avm) { return(rotation * avm.vesselRef.mainBody.transform.right); }
public static Quaternion getPlaneRotation(double heading, AsstVesselModule avm) { Vector3 planeNormal = vecHeading(heading, avm); return(getPlaneRotation(planeNormal, avm)); }
/// <summary> /// calculate the planet relative rotation from the plane normal vector /// </summary> public static Quaternion getPlaneRotation(Vector3 planeNormal, AsstVesselModule avm) { return(Quaternion.FromToRotation(avm.vesselRef.mainBody.transform.right, planeNormal)); }