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

Итак, я пробовал вариации на основе 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, и я пока не могу публиковать изображения. Поэтому ссылка, извините.
Правильно: Хороший результат 
Неверно: Плохой результат 
Действительно надеюсь, что кто-то может пролить свет на эту проблему. Нужна ли матрица вращения для вращения вектора скорости? Или умножение на (правильное) нормальное / касательное достаточно? Для меня это выглядит так, за исключением этих странных странностей, и почему-то мне кажется, что я упускаю из виду что-то тривиальное.
Однако , математика на самом деле не мое и расшифровка формул - довольно сложная задача для меня. Поэтому, пожалуйста, потерпите меня и постарайтесь сделать язык относительно простым (для меня имена векторных функций гораздо проще, чем научная математическая запись c). То, что я получил это далеко, уже является для меня настоящим достижением.
Я старался быть как можно более ясным, но если что-то неясно, я с удовольствием уточню их подробнее.