bmh/FlightSimulation/Plugins/CesiumForUnreal_5.4/Source/CesiumRuntime/Public/CesiumEllipsoid.h
2025-02-07 22:52:32 +08:00

149 lines
4.5 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#pragma once
#include "Engine/DataAsset.h"
#include "Misc/Optional.h"
#include <CesiumGeospatial/LocalHorizontalCoordinateSystem.h>
#include "CesiumEllipsoid.generated.h"
namespace CesiumGeospatial {
class Ellipsoid;
};
UCLASS()
class CESIUMRUNTIME_API UCesiumEllipsoid : public UDataAsset {
GENERATED_BODY()
public:
/**
* Creates a new {@link UCesiumEllipsoid} with the given radii.
*
* This is equivalent to
* ```
* auto ellipsoid = NewObject<UCesiumEllipsoid>();
* ellipsoid->SetRadii(Radii);
* ```
*/
UFUNCTION(BlueprintCallable, Category = "Cesium|Ellipsoid")
static UCesiumEllipsoid* Create(const FVector& Radii);
/**
* Gets the radii of the ellipsoid in its x-, y-, and z-directions in
* meters.
*/
UFUNCTION(BlueprintPure, Category = "Cesium|Ellipsoid")
FVector GetRadii();
/**
* Sets the radii of this ellipsoid in its x-, y-, and z-directions in meters.
*
* Tilesets using this ellipsoid may have to be refreshed to see the changes
* applied.
*/
void SetRadii(const FVector& NewRadii);
/**
* Gets the maximum radius of the ellipsoid in any dimension, in meters.
*/
UFUNCTION(BlueprintPure, Category = "Cesium|Ellipsoid")
double GetMaximumRadius();
/**
* Gets the minimum radius of the ellipsoid in any dimension, in
* meters.
*/
UFUNCTION(BlueprintPure, Category = "Cesium|Ellipsoid")
double GetMinimumRadius();
/**
* Scale the given Ellipsoid-Centered, Ellipsoid-Fixed position along the
* geodetic surface normal so that it is on the surface of the ellipsoid. If
* the position is near the center of the ellipsoid, the result will have the
* value (0,0,0) because the surface position is undefined.
*/
UFUNCTION(
BlueprintPure,
Category = "Cesium|Ellipsoid",
meta = (ReturnDisplayName = "SurfacePosition"))
FVector
ScaleToGeodeticSurface(const FVector& EarthCenteredEarthFixedPosition);
/**
* Computes the normal of the plane tangent to the surface of the ellipsoid
* at the provided Ellipsoid-Centered, Ellipsoid-Fixed position.
*/
UFUNCTION(
BlueprintPure,
Category = "Cesium|Ellipsoid",
meta = (ReturnDisplayName = "SurfaceNormalVector"))
FVector GeodeticSurfaceNormal(const FVector& EarthCenteredEarthFixedPosition);
/**
* Convert longitude in degrees (X), latitude in degrees (Y), and height above
* the ellipsoid in meters (Z) to Ellipsoid-Centered, Ellipsoid-Fixed (ECEF)
* coordinates.
*/
UFUNCTION(
BlueprintPure,
Category = "Cesium|Ellipsoid",
meta = (ReturnDisplayName = "EarthCenteredEarthFixedPosition"))
FVector LongitudeLatitudeHeightToEllipsoidCenteredEllipsoidFixed(
const FVector& LongitudeLatitudeHeight);
/**
* Convert Ellipsoid-Centered, Ellipsoid-Fixed (ECEF) coordinates to longitude
* in degrees (X), latitude in degrees (Y), and height above the ellipsoid in
* meters (Z). If the position is near the center of the Ellipsoid, the result
* will have the value (0,0,0) because the longitude, latitude, and height are
* undefined.
*/
UFUNCTION(
BlueprintPure,
Category = "Cesium|Ellipsoid",
meta = (ReturnDisplayName = "LongitudeLatitudeHeight"))
FVector EllipsoidCenteredEllipsoidFixedToLongitudeLatitudeHeight(
const FVector& EarthCenteredEarthFixedPosition);
/**
* Computes the transformation matrix from the local East-North-Up (ENU) frame
* to Ellipsoid-Centered, Ellipsoid-Fixed (ECEF) at the specified ECEF
* location.
*/
FMatrix EastNorthUpToEllipsoidCenteredEllipsoidFixed(
const FVector& EarthCenteredEarthFixedPosition);
/**
* Returns a new {@link CesiumGeospatial::LocalHorizontalCoordinateSystem}
* with the given scale, center, and ellipsoid.
*/
CesiumGeospatial::LocalHorizontalCoordinateSystem
CreateCoordinateSystem(const FVector& Center, double Scale);
/**
* Returns the underlying {@link CesiumGeospatial::Ellipsoid}
*/
const CesiumGeospatial::Ellipsoid& GetNativeEllipsoid();
protected:
/**
* The radii of this ellipsoid.
*
* The X coordinate of the vector should be the radius of the largest axis and
* the Z coordinate should be the radius of the smallest axis.
*/
UPROPERTY(
EditAnywhere,
Category = "Cesium|Ellipsoid",
meta = (DisplayName = "Radii"))
FVector Radii;
private:
#if WITH_EDITOR
virtual void
PostSaveRoot(FObjectPostSaveRootContext ObjectSaveContext) override;
#endif
TOptional<CesiumGeospatial::Ellipsoid> NativeEllipsoid;
};