Cesium ion Moon terrain appears ~2.5 km higher than LOLA / SLDEM2015 DEM at the same lon/lat

Hi Cesium team,

I am using the Cesium ion Moon 3D Tiles asset in a lunar simulation workflow and found what appears to be a consistent vertical height offset between the rendered Cesium Moon terrain mesh and LOLA / SLDEM2015 DEM heights.

Environment

  • CesiumJS: 1.141
  • Cesium ion Moon asset id: 2684829
  • Moon ellipsoid used in my app: Cesium.Ellipsoid.MOON
  • The tileset metadata reports:
"extensionsUsed": ["3DTILES_ellipsoid"],
"3DTILES_ellipsoid": {
  "body": "Moon",
  "radii": [1737400, 1737400, 1737400]
}

Local reference DEMs
I compared Cesium terrain heights against:

Local LOLA LDEM_1024 JP2 tiles

CRS: GCS_Moon_2000
Reference radius: 1737400 m
Pixel type: int16
Height conversion: height_m = DN * 0.5
USGS / Astropedia Lunar_LRO_LOLAKaguya_DEMmerge_60N60S_512ppd.tif

SLDEM2015 / LOLA-Kaguya merge family
This should be close to the Moon terrain source listed for the mid-latitude Cesium Moon terrain.
The two DEM references agree with each other very closely at my sampled points:

SLDEM2015 - local LDEM_1024:
mean   = +3.16 m
median = +0.25 m
std    = 28.81 m

So the local DEM reading and lon/lat alignment seem correct.

Test method
For 80 probe frames, I sampled the Cesium Moon terrain in two ways:

Scene.sampleHeightMostDetailed() at the camera subpoint lon/lat.
Center-pixel Scene.pickPosition() from the rendered depth buffer, converted back to Moon cartographic height. Then I also called sampleHeightMostDetailed() at the picked lon/lat.
The two Cesium methods agree with each other:

pickPosition - sampleHeightMostDetailed:
mean   = +0.75 m
median = +0.48 m
std    = 5.93 m

But both are about +2.5 km higher than LOLA / SLDEM2015:

sampleHeightMostDetailed - local LDEM_1024:
mean   = +2515.90 m
median = +2522.68 m
std    = 58.18 m

pickPosition - local LDEM_1024:
mean   = +2516.65 m
median = +2523.23 m
std    = 60.24 m

sampleHeightMostDetailed - SLDEM2015:
mean   = +2512.74 m
median = +2516.03 m
std    = 52.56 m

A few example points:

lon=1.000000, lat=0.000000
Cesium terrain height = +1827.45 m
local LDEM_1024       = -733.50 m
difference            = +2560.95 m

lon=57.620187, lat=7.762019
Cesium terrain height = +1531.16 m
local LDEM_1024       ≈ -984 m
difference            ≈ +2515 m

After subtracting the median offset, the residuals are only tens of meters, so this looks like an almost constant vertical datum / asset-processing offset rather than a lon/lat alignment issue.

Question
Is the current Cesium ion Moon 3D Tiles terrain asset expected to be approximately +2.5 km above LOLA / SLDEM2015 heights relative to the 1737400 m Moon reference sphere?

If yes, what vertical datum or height convention is the Moon terrain mesh using?

If no, could this indicate a tiling / vertical offset issue in the current Moon asset version?

I noticed this older thread about Moon terrain altimetry scaling:

My result does not look like a 2x scale error. It looks more like a nearly constant +2.5 km offset. I can provide the CSV / JSON probe records and plots if helpful.

Thanks!

It looks like some of the formatting was broken in the post. Combining bullet points (with indentation) and code/text blocks can be tricky in discourse. I tried to fix it, maybe you want to have another look.


Beyond that, I have not yet looked at the technical details here. Only as a quick pointer: It appears that the ellipsoid radii for the moon are taken from CesiumMath.LUNAR_RADIUS, which carries a note:

/**
 * The mean radius of the moon, according to the "Report of the IAU/IAG Working Group on
 * Cartographic Coordinates and Rotational Elements of the Planets and satellites: 2000",
 * Celestial Mechanics 82: 83-110, 2002.
 * @type {number}
 * @constant
 */
CesiumMath.LUNAR_RADIUS = 1737400.0;

(It also looks like the 3DTILES_ellipsoid extension is not actually used by CesiumJS, so it’s not perfectly clear (for me) where these values are coming from in the actual application)

Thanks for the clarification. You are right: I should not imply that the 3DTILES_ellipsoid extension is necessarily consumed by CesiumJS at runtime.

In my application, the runtime ellipsoid used for lon/lat/height conversion is explicitly Cesium.Ellipsoid.MOON, and I also set Cesium.Ellipsoid.default = Cesium.Ellipsoid.MOON. So the reference radius used in my height calculations comes from CesiumMath.LUNAR_RADIUS = 1737400.0.

The 3DTILES_ellipsoid metadata is therefore only an additional consistency check, not my main evidence for the runtime ellipsoid radius.

The main observation remains that both Scene.pickPosition() on the rendered Moon mesh and Scene.sampleHeightMostDetailed() return heights about +2.5 km above LOLA LDEM_1024 / SLDEM2015 at the same lon/lat.
Here’s an example: I had the camera point directly at the Moon and captured 451 images, then obtained the terrain elevation at each camera pose. I compared these elevations with the values at the same latitude and longitude in the LOLA DEM. Fitting the 451 elevation data points revealed a nearly constant offset of approximately 2.5 km between the two datasets. I am very confused about where this offset originates.