Cesium JS椭球切面计算

Cesium JS ellipsoid tangent plane calculation

问题

我对 Cesium 如何计算大地测量和地心表面法线有点困惑。由计算法线生成的平面在给定点实际上并不与椭球面相切,而且,由大地表面法线生成的平面与由地心表面法线生成的平面相同。

示例以及我为什么需要这个

在此 Sandcastle 中,当您单击地球表面时,将绘制 XYZ 轴以及应与椭球体相切的平面。

我需要的是在给定点处获得与椭圆体相切的 XY 平面,然后将其他点投影到该平面上。问题是我看到飞机根本不与椭球相切。

顺便说一下 - 当我使用内置方法时:Cesium.EllipsoidTangentPlane();我也得到了奇怪的结果 - 平面仍然不与椭球相切并且还漂浮在 space 中的某个地方。这里是 sandcastle.

感谢任何帮助,因为我不明白这里发生了什么。

平面的法线定义在平面的局部坐标系,其中x、y、z轴分别表示地球(world或ECEF)中的东、北、上方向. 所以如果在ECEF中给定了一个平面的法向量,你就得像这样在平面的局部坐标系下进行转换。

    // get the local coordinate system of the plane
    var transform = Cesium.Transforms.eastNorthUpToFixedFrame(clickedPoint);
    // get invert matrix
    var inv = Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4());
    // in this case actually world normal coincide with up direction(z axis of coordinate system)
    // to avoid error we slightly extend it.
    var extendedWordNormal = Cesium.Cartesian3.multiplyByScalar(clickedPoint, 1.001, new Cesium.Cartesian3());
    
    // it will be nearly same as (0, 0, 1)
    var localNormal = Cesium.Matrix4.multiplyByPoint(inv, extendedWordNormal, new Cesium.Cartesian3());

    //var localNormal = new Cesium.Cartesian3(0, 0, 1);

请检查这个sandcastle and this sample