Body Rotations - ECI to?

Hi All,

Currently working on satellite simulation and exploring Cesium for Unreal at the moment.

Is someone able to clarify what frame Cesium is using?

I have an object in ECI, apply an ECI2ECEF rotation using a rotator from SPICE and then try to apply the rotation from Georeference->GetEllipsoidCenteredToUnrealWorldTransform but see a drift away from the expected behaviour that is dependent on position. I’ve tried applying another rotation to the ENU frame but no luck.

Any tips appreciated.


Hi @Chip343,

You’re on the right track. What Cesium for Unreal calls the “ellipsoid centered” frame is ECEF / ITRF. However, the “Unreal World” might be surprising. It’s not relative to the normal UE world coordinates, but rather to UE’s absolute origin. The location of the local UE world in the absolute coordinate frame is specified by the OriginLocation property of UWorld. By default, as the camera moves, the CesiumGeoreference moves the OriginLocation to stay near the camera. This helps preserve precision and avoid jittering artifacts.

So if you have a position vector expressed in ECI, and you want to find its position in the normal UE world coordinates, you need to apply the following transformations in order:

  1. ECI → ECF
  2. ECF → UE absolute world (GetEllipsoidCenteredToUnrealWorldTransform)
  3. UE absolute world → UE local world (subtract UWorld::OriginLocation)

As a quick way to confirm that the local/absolute UE world coordinates are causing the drift you’re seeing, you can disable the “KeepWorldOriginNearCamera” property of the CesiumGeoreference. If you do that, the OriginLocation property should always be a zero vector (as long as nothing else in your level is changing the origin).


Hi Kevin,

Thanks for the reply.

Yes, I think it’s the 3rd rotation that’s the issue. I’ll check to see whether the problem resolves if I disable the georeference movement.

I should probably clarify that we aren’t having issues with rotating a position. Our problem is in applying the correct rotations to the attached actor object. In our actor, we transform ECEF position to Cesium using the georeference TransformEcefToUe function, which does the absolute to local world subtraction to put our actor in the correct local space (for our use case, this has it’s own issues because the origin is updating frequently and because it’s an FIntVector we’re seeing some truncation issues).

I think our challenge is working out what the correct rotator is from UE absolute to local frame is. I thought this would come from the GetEllipsoidCenteredToGeoreferencedTransform (this might be the wrong name, can’t access the code right now) but no luck.

Happy to jump on a call and walk you through what we’re doing if you’re interested.


Just to be clear, the third transformation isn’t a rotation, it’s a translation only.

And yep, you’re right: TransformEcefToUe automatically accounts for the OriginLocation and gives you a correct Actor position. When the camera moves, the coordinate values can and will change, though, because the OriginLocation changes. UE will account for this automatically, but not necessarily preserve precision as well as we’d like. The CesiumGeoreferenceComponent is very helpful if you want to specify a position in ECEF coordinates and have it stay precisely there (until you move it). This tutorial might help: