#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/…