@babylonjs/core
Version:
Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.
60 lines • 3.31 kB
JavaScript
import { Clamp } from "./math.scalar.functions.js";
import { Vector3FromFloatsToRef } from "./math.vector.functions.js";
const HalfPi = Math.PI / 2;
const DegreesToRadians = Math.PI / 180;
const EllipsoidFromSemiMajorAxisAndInverseFlattening = (semiMajorAxis, inverseFlattening) => {
const flattening = 1 / inverseFlattening;
const semiMinorAxis = semiMajorAxis * (1 - flattening);
const firstEccentricitySquared = 2 * flattening - flattening * flattening;
const secondEccentricitySquared = firstEccentricitySquared / (1 - firstEccentricitySquared);
return { semiMajorAxis, semiMinorAxis, flattening, firstEccentricitySquared, secondEccentricitySquared };
};
/**
* The WGS84 reference ellipsoid used for Earth-related geospatial functions.
* Derived from the semi-major axis (meters) and the inverse flattening.
*/
export const Wgs84Ellipsoid = Object.freeze(EllipsoidFromSemiMajorAxisAndInverseFlattening(6378137.0, 298.257223563));
/**
* Converts the latitude and longitude specified in degrees to an {@link ILatLonLike} in radians.
* @param lat - The latitude in degrees
* @param lon - The longitude in degrees
* @param result - The resulting {@link ILatLonLike} in radians
* @returns The resulting {@link ILatLonLike} in radians
*/
export function LatLonFromDegreesToRef(lat, lon, result) {
result.lat = lat * DegreesToRadians;
result.lon = lon * DegreesToRadians;
return result;
}
/**
* Computes the normal (up direction) in ECEF (Earth-Centered, Earth-Fixed) coordinates from the specified latitude and longitude in radians.
* For the calculation, latitude is clamped to -PI/2 to PI/2.
* @param latLon - The latitude and longitude in radians
* @param result - The resulting normal
* @returns The resulting normal
*/
export function LatLonToNormalToRef(latLon, result) {
const lat = Clamp(latLon.lat, -HalfPi, HalfPi);
const cosLat = Math.cos(lat);
return Vector3FromFloatsToRef(cosLat * Math.cos(latLon.lon), cosLat * Math.sin(latLon.lon), Math.sin(lat), result);
}
/**
* Converts latitude, longitude, and altitude to an ECEF (Earth-Centered, Earth-Fixed) position using the specified ellipsoid.
* For the calculation, latitude is clamped to -PI/2 to PI/2.
* @param latLonAlt - The latitude and longitude in radians, and the altitude relative to the reference ellipsoid's surface.
* @param ellipsoid - Parameters for a reference ellipsoid (e.g., the {@link Wgs84Ellipsoid}).
* @param result - The resulting ECEF position
* @returns The resulting ECEF position
*/
export function EcefFromLatLonAltToRef(latLonAlt, ellipsoid, result) {
const lat = Clamp(latLonAlt.lat, -HalfPi, HalfPi);
const { lon, alt } = latLonAlt;
const { semiMajorAxis, firstEccentricitySquared } = ellipsoid;
const sinLat = Math.sin(lat);
// eslint-disable-next-line @typescript-eslint/naming-convention
const N = semiMajorAxis / Math.sqrt(1 - firstEccentricitySquared * sinLat * sinLat);
// eslint-disable-next-line @typescript-eslint/naming-convention
const NPlusAltTimesCosLat = (N + alt) * Math.cos(lat);
return Vector3FromFloatsToRef(NPlusAltTimesCosLat * Math.cos(lon), NPlusAltTimesCosLat * Math.sin(lon), (N * (1 - firstEccentricitySquared) + alt) * sinLat, result);
}
//# sourceMappingURL=math.geospatial.functions.js.map