示例#1
0
        public Tuple3 BedrockPosition(double latitude, double longitude, ReferenceFrame referenceFrame)
        {
            var altitude = BedrockHeight(latitude, longitude);
            var position = InternalBody.GetWorldSurfacePosition(latitude, longitude, altitude);

            return(referenceFrame.PositionFromWorldSpace(position).ToTuple());
        }
示例#2
0
 Tuple3 PositionAt (double latitude, double longitude, double altitude, ReferenceFrame referenceFrame)
 {
     if (ReferenceEquals (referenceFrame, null))
         throw new ArgumentNullException (nameof (referenceFrame));
     var position = InternalBody.GetWorldSurfacePosition (latitude, longitude, altitude);
     return referenceFrame.PositionFromWorldSpace (position).ToTuple ();
 }
示例#3
0
 public Tuple3 Velocity(ReferenceFrame referenceFrame)
 {
     if (ReferenceEquals(referenceFrame, null))
     {
         throw new ArgumentNullException(nameof(referenceFrame));
     }
     return(referenceFrame.VelocityFromWorldSpace(InternalBody.position, InternalBody.GetWorldVelocity()).ToTuple());
 }
示例#4
0
 public double AltitudeAtPosition(Tuple3 position, ReferenceFrame referenceFrame)
 {
     if (ReferenceEquals(referenceFrame, null))
     {
         throw new ArgumentNullException(nameof(referenceFrame));
     }
     return(InternalBody.GetAltitude(referenceFrame.PositionToWorldSpace(position.ToVector())));
 }
示例#5
0
        public double LongitudeAtPosition(Tuple3 Position, ReferenceFrame referenceFrame)
        {
            if (ReferenceEquals(referenceFrame, null))
            {
                throw new ArgumentNullException(nameof(referenceFrame));
            }
            var adjustedPosition = referenceFrame.PositionToWorldSpace(Position.ToVector());

            return(InternalBody.GetLongitude(adjustedPosition));
        }
示例#6
0
        public Tuple4 Rotation(ReferenceFrame referenceFrame)
        {
            var up      = Vector3.up;
            var right   = InternalBody.GetRelSurfacePosition(0, 0, 1).normalized;
            var forward = Vector3.Cross(right, up);

            Vector3.OrthoNormalize(ref forward, ref up);
            var rotation = Quaternion.LookRotation(forward, up);

            return(referenceFrame.RotationFromWorldSpace(rotation).ToTuple());
        }
示例#7
0
 public Tuple4 Rotation (ReferenceFrame referenceFrame)
 {
     if (ReferenceEquals (referenceFrame, null))
         throw new ArgumentNullException (nameof (referenceFrame));
     var up = Vector3.up;
     var right = InternalBody.GetRelSurfacePosition (0, 0, 1).normalized;
     var forward = Vector3.Cross (right, up);
     Vector3.OrthoNormalize (ref forward, ref up);
     var rotation = Quaternion.LookRotation (forward, up);
     return referenceFrame.RotationFromWorldSpace (rotation).ToTuple ();
 }
示例#8
0
        public double AtmosphericDensityAtPosition(Tuple3 Position, ReferenceFrame referenceFrame)
        {
            if (ReferenceEquals(referenceFrame, null))
            {
                throw new ArgumentNullException(nameof(referenceFrame));
            }
            var adjustedPosition = referenceFrame.PositionToWorldSpace(Position.ToVector());
            var altitude         = InternalBody.GetAltitude(adjustedPosition);
            var latitude         = InternalBody.GetLatitude(adjustedPosition);
            var pressure         = FlightGlobals.getStaticPressure(adjustedPosition);
            var temperature      = FlightGlobals.getExternalTemperature(altitude, InternalBody)
                                   + InternalBody.atmosphereTemperatureSunMultCurve.Evaluate((float)altitude)
                                   * (InternalBody.latitudeTemperatureBiasCurve.Evaluate((float)latitude)
                                      + InternalBody.latitudeTemperatureSunMultCurve.Evaluate((float)latitude) // fix that 0 into latitude
                                      + InternalBody.axialTemperatureSunMultCurve.Evaluate(1));

            return(FlightGlobals.getAtmDensity(pressure, temperature));
        }
示例#9
0
        public double SurfaceHeight (double latitude, double longitude)
        {
            var alt = Math.Max (0, BedrockHeight (latitude, longitude));
            // Using raycast to find real surface height.
            const double raySource = 1000;
            const double raySecondPoint = 500;
            Vector3d rayCastStart = InternalBody.GetWorldSurfacePosition(latitude, longitude, alt + raySource);
            Vector3d rayCastStop = InternalBody.GetWorldSurfacePosition(latitude, longitude, alt + raySecondPoint);
            RaycastHit hit;
            //Casting a ray on the surface (layer 15 in KSP).
            if (Physics.Raycast(rayCastStart, (rayCastStop - rayCastStart), out hit, float.MaxValue, 1 << 15))

            {
                // Ensure hit is on the topside of planet, near the rayCastStart, not on the far side.
                if (Mathf.Abs(hit.distance) < 3000)
                {
                    // Okay, a hit was found, use it instead of PQS alt:
                    alt = alt + raySource - hit.distance;
                }
            }
            return alt;
        }
示例#10
0
 /// <summary>
 /// Hash code for the object.
 /// </summary>
 public override int GetHashCode()
 {
     return(InternalBody.GetHashCode());
 }
示例#11
0
 public Tuple3 Velocity(ReferenceFrame referenceFrame)
 {
     return(referenceFrame.VelocityFromWorldSpace(InternalBody.position, InternalBody.GetWorldVelocity()).ToTuple());
 }
示例#12
0
        public Tuple3 MSLPosition(double latitude, double longitude, ReferenceFrame referenceFrame)
        {
            var position = InternalBody.GetWorldSurfacePosition(latitude, longitude, 0);

            return(referenceFrame.PositionFromWorldSpace(position).ToTuple());
        }