public static Tuple3 TransformVelocity(Tuple3 position, Tuple3 velocity, ReferenceFrame from, ReferenceFrame to) { var worldPosition = from.PositionToWorldSpace(position.ToVector()); var worldVelocity = from.VelocityToWorldSpace(position.ToVector(), velocity.ToVector()); return(to.VelocityFromWorldSpace(worldPosition, worldVelocity).ToTuple()); }
public Tuple3 SimulateAerodynamicForceAt(CelestialBody body, Tuple3 position, Tuple3 velocity) { if (ReferenceEquals(body, null)) { throw new ArgumentNullException(nameof(body)); } var vessel = InternalVessel; var worldVelocity = referenceFrame.VelocityToWorldSpace(position.ToVector(), velocity.ToVector()); var worldPosition = referenceFrame.PositionToWorldSpace(position.ToVector()); Vector3 worldForce; if (!FAR.IsAvailable) { worldForce = StockAerodynamics.SimAeroForce(body.InternalBody, vessel, worldVelocity, worldPosition); } else { Vector3 torque; var altitude = (worldPosition - body.InternalBody.position).magnitude - body.InternalBody.Radius; FAR.CalculateVesselAeroForces(vessel, out worldForce, out torque, worldVelocity - body.InternalBody.getRFrmVel(worldPosition), altitude); } return(referenceFrame.DirectionFromWorldSpace(worldForce).ToTuple()); }