Расчет касательной плоскости эллипсоида цезия JS

#javascript #projection #calculation #cesium

Вопрос:

Проблема

Я немного запутался в том, как Цезий вычисляет геодезическую и геоцентрическую нормаль поверхности. Плоскости, сгенерированные из вычисленной нормали, на самом деле не касаются поверхности эллипсоида в данной точке, более того, плоскость, созданная из геодезической нормали поверхности, точно такая же, как и плоскость, сгенерированная из геоцентрической нормали поверхности.

Пример и зачем мне это нужно

В этом замке из песка ось XYZ вместе с плоскостями, которые должны касаться эллипсоида, рисуются при нажатии на поверхность глобуса.

Что мне нужно, так это получить плоскость XY, касательную к эллипсоиду в данной точке, а затем спроецировать другие точки на эту плоскость. Проблема в том, что, как я вижу, плоскость вообще не касательна к эллипсоиду.

Кстати — когда я использую встроенный метод: Цезий.Эллипсоидтангентная плоскость(); Я также получаю странный результат — плоскость все еще не касательна к эллипсоиду и также плавает где-то в пространстве. Вот замок из песка.

Ценю любую помощь, потому что я не понимаю, что здесь происходит.

Ответ №1:

Нормаль плоскости определяется в локальной системе координат плоскости, оси x, y и z которой указывают направление на восток, север и вверх на земле(мир или 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);
 

Пожалуйста, проверьте этот замок из песка и этот образец

Комментарии:

1. Чувак, спасибо! Я потратил много времени, пытаясь понять, что происходит, теперь все ясно.

2. рад вам помочь!

3. У меня есть еще один вопрос — правильно ли я понимаю, что при использовании плоскостной графики нормаль плоскости должна быть определена в локальных координатах плоскости, но если необходимо спроецировать точку Cartesian3 на плоскость, нормаль плоскости должна быть определена в координатах ECEF? Я спрашиваю, потому что, когда я проецирую точку на плоскость с нормалью, определенной в локальных координатах плоскости, а затем рисую эту точку, она не появляется в нужном месте. К сожалению, я не могу поделиться sandcastle из-за ограничений максимальной длины сообщений Stackoverflow.

4. К сожалению, я не могу, вот ошибка, которую я получил: Too long by 2844 characters . Но я поделился примерами на форуме, вот ссылка: community.cesium.com/t/planes-normal-coordinate-system-solved/…