Стендап Сьогодні
📢 Канал в Telegram @stendap_sogodni
🦣 @stendap_sogodni@shevtsov.me в Федиверсі

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

16.06.2025

Проєкція GPX на світлину


Перший результат. Так близько, але так далеко…

⛰️ Дивився сьогодні на світлину схилу гори, на якій було видно стежку. Та це навіяло ідею: а що, якщо, маючи GPX-трек маршруту, показувати його на світлині? Тут є моменти, які очевидно майже нереально зробити автоматично (як-от не показувати те, що сховане за ландшафтом), але в цілому має бути здійсненно.

(Пошукові системи мене не розуміють, тож уточню: йдеться не про світлину згори вниз, тобто мапу, а про звичайну пейзажну світлину. На мапу накласти трек проблем не складає, та інструментів для цього вистачає.)

Переглянув, яку інформацію зберігає айфон у світлині. Виходить, що дуже багато! (Навіть є uptime телефону, але то нам не треба.) GPS-координати та висота — звісно, що є. Також є GPSImgDirection, тобто азимут фільмування. І нарешті, AccelerationVector - показники акселерометра, тобто кути нахилу телефону. Та навіть FOV - кут огляду камери (він різний у різних обʼєктивів). Одним словом, у нас є всі дані для реконструкції матриці камери!

Далі що. Завантажуємо трек (до речі, GPX - це XML.) Переводимо його у пласку систему координат XYZ. Тут головний нюанс — що градус довготи змінює довжину залежно від широти, а інші нюанси є в моїй статті про координати. Та, до речі, поки припустив, що викривлення земної поверхні не важливе, хоча й це можна врахувати.

Тепер наче залишається суто класична задача 3D-графіки: перспективна проєкція. Для того має сенс взяти готову бібліотеку, як-от Three.js. Там як раз можна збудувати камеру з кутів повороту, кута огляду, співвідношення сторін тощо. І далі однією операцією project() точки переходять в систему координат зображення.

А потім з тих координат малюємо поверх світлини ламану — наприклад, бібліотекою sharp або той же ж Three.js. То й все! Маршрут побудований.

От тільки поки я до кінця не налагодив всю цю математику, тому проміжний результат — ось, а далі буде.