Спроецируйте трехмерные значения скорости из векторного поля вокруг сферы, чтобы создать линии потока - PullRequest
0 голосов
/ 01 апреля 2020

Я просто не могу понять, как заставить точку с заданной скоростью перемещаться в декартовом пространстве в моей визуализации, пока остается вокруг сферы (pl anet).

Ввод:

Множество точек с:

  1. Положение вектора 3 в XYZ (координаты широты / долготы, преобразованные с помощью сферической функции ниже).
  2. Скорость Vector3 (например, 1,0 м / с на восток, изменение высоты 0,0 м / с, 2,0 м / с на север). Обратите внимание, что это , а не градусов, всего несколько метров в секунду, которые похожи на мои космические единицы.

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

Цель: Цель состоит в том, чтобы создать несколько линий тока вокруг сферы, например, так:

Пример изображение векторов вокруг земного шара

Example image of vectors around a globe

Итак, я пробовал вариации на основе c идеи: Привести нормаль к центру моего сфера, получить перпендикулярный вектор и умножить это снова, чтобы получить касательную:

// Sphere is always at (0,0,0); but just to indicate for completeness:
float3 normal = objectposition - float3(0,0,0);

// Get perpendicular vector of our velocity.
float3 tangent = cross(normal,velocity);

// Calculate final vector by multiplying this with our original normal
float3 newVector = cross(normal, tangent);

// And then multiplying this with length (magnitude) of the velocity such that the speed is part of the velocity again.
float final_velocity = normalize(newVector) * length(velocity);

Однако, это работает только для области данных, похоже, что это работает только на половине западного полушария ( скажем, США). Чтобы он (частично) работал в восточно-южной области (скажем, в Южной Африке), мне пришлось переключить компоненты U и V.

Координаты XYZ сферы создаются с использованием сферических координат:

x = radius * Math.Cos(lat) * Math.Cos(lon);
y = radius * Math.Sin(lat);
z = radius * Math.Cos(lat) * Math.Sin(lon);

Конечно, я также пробовал все виды вариаций с умножением различных векторов «вверх / вправо», таких как float3 (0,1,0) или float3 (0,0,1), переключаясь вокруг U / V / W компонентов, et c. превратить скорость в то, что работает хорошо. Но после 30 часов бездействия я надеюсь, что кто-то может помочь мне с этим и направить меня в правильном направлении. Проблема в основном в том, что верна только часть сферы.

Учитывая, что часть данных визуализируется очень хорошо, я думаю, что это должно быть возможно с помощью перекрестных и точечных продуктов. Поскольку производительность здесь действительно важна, я стараюсь держаться подальше от «дорогих» тригонометрических операций - , если возможно .

Я попытался переключить компоненты скорости, и во всех случаях одна область / полусфера работает нормально, а другие - нет. Например, переключение между U и V (некоторое время игнорируя W) заставляет работать и Африку, и США. Но на полпути в США дела go снова не так.

Чтобы проиллюстрировать проблему немного, пару изображений. Большое фиолетовое изображение было сгенерировано с помощью QGIS3 и показывает, как оно должно быть:

К сожалению, у меня есть новая учетная запись SO, и я пока не могу публиковать изображения. Поэтому ссылка, извините.

Правильно: Хороший результат Good result

Неверно: Плохой результат Bad result

Действительно надеюсь, что кто-то может пролить свет на эту проблему. Нужна ли матрица вращения для вращения вектора скорости? Или умножение на (правильное) нормальное / касательное достаточно? Для меня это выглядит так, за исключением этих странных странностей, и почему-то мне кажется, что я упускаю из виду что-то тривиальное.

Однако , математика на самом деле не мое и расшифровка формул - довольно сложная задача для меня. Поэтому, пожалуйста, потерпите меня и постарайтесь сделать язык относительно простым (для меня имена векторных функций гораздо проще, чем научная математическая запись c). То, что я получил это далеко, уже является для меня настоящим достижением.

Я старался быть как можно более ясным, но если что-то неясно, я с удовольствием уточню их подробнее.

1 Ответ

0 голосов
/ 12 апреля 2020

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

Самое важное - преобразовать скорость. используя матрицу вращения нет. 6 от ECEF до координат ENU . Я пытался скопировать матрицу с сайта; но это не очень хорошо приклеить. Итак, вместо этого некоторый код:

Matrix3x3:

-sinLon, cosLon, 0,
-cosLon * sinLat, -sinLon * sinLat, cosLat,
 cosLon * cosLat, sinLon * cosLat, sinLat

Lon / Lat должен быть получен через функцию преобразования декартовых в полярные координаты для заданного местоположения, к которому относится ваша скорость.

Предпочел бы метод, который не требует функций sin / cos, но я не уверен, что это все-таки возможно.

...