I tried today to implement a glsl compatible way to get from a Cartesian point distance to ellipsoid.

Because Ellipsoid.WGS84.cartesianToCartographic is to complicated to calculate for each point (and I don't need all values), I tried another way:

// Calculate angle between XY plane and p

var angle = Math.asin(Math.abs(p.z) / Cesium.Cartesian3.magnitude(p));

// Map angle to ellipsoid and get length

var ellipsoidHeight = Math.sqrt(Math.pow(Cesium.Ellipsoid.WGS84._radii.x * Math.cos(angle), 2.0) + Math.pow(Cesium.Ellipsoid.WGS84._radii.z * Math.sin(angle), 2.0));

Now I expected following condition is true (or nearly)

Cesium.Ellipsoid.WGS84.cartesianToCartographic(p).height === Cesium.Cartesian3.magnitude(p) - ellipsoidHeight

But this is not the case. The difference with my test coordinates are around 25 meter. So I compared following condition:

Cesium.Cartesian3.magnitude(Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(p)) === ellipsoidHeight

But already there I get the difference. So miss I something on my calculation or is cartesianToCartographic wrong?