Клиначев Н.В.

Визуализация полёта космического аппарата к целевому объекту

3D-сцена. Визуализация полёта КА

Данная веб-страница продолжает серию документов демонстрирующих программный код трехмерной визуализации движения космического аппарата (КА) и соответствующих систем управления. Выше по тексту на 3D-сцене представлено интерактивное изображение КА. После загрузки веб-страницы запускается встроенная в документ программа, написанная на языке JavaScript. Программа выставляет случайные значения положения КА (углы Брайна: крен, тонгаж, рысканье) и значения проекций угловых скоростей на подвижные координаты. Инициирует расчёт движения КА, как твердого тела, вокруг центра масс. Четыре секунды можно наблюдать собственное вращение КА. По их истечению, программа включает двухконтурную систему автоматического регулирования положения КА (систему ориентации). И можно наблюдать процессы замедления начального вращения и приведение КА в заданное угловое положение (задания по углам – нулевые). Предыдущие документы более подробно описывают этот процесс.

Когда КА будет ориентирован, его корпус, условно отображенный отрезком трубы, не будет закрывать ближайший фрагмент трека полётного задания до целевого объекта. Т.е. камера, снимающая 3D-сцену, находиться позади КА. И сквозь его корпус-трубу виден упомянутый трек полёта. Нажмите на клавиатуре клавишу "F" (fly). Программа начнет перемещать КА по треку полётного задания. Автопилота, который бы управлял двигателями КА, в коде программы нет. И система ориентации не поворачивает КА по направлению полёта. Документ предназначен исключительно для демонстрации приёмов программирования положения камеры в 3D-сцене и генерации трека полётного задания. При обновлении веб-страницы полётное задание выбирается случайным образом из пяти вариантов.

Для генерации трека полётного задания используется кривая Безье [1], определяемая в трехмерном пространстве. Космические аппараты, выполняющие маневры, по таким траекториям не летают – большой расход топлива. Но для отладки автопилота (системы автоматического управления полётом) их использовать можно. Вычисление точек принадлежащих кривой Безье (полётному треку) выполняется с помощью функции javascript-библиотеки glMatrix [2]. Эта же библиотека используется и для других вычислений, которые необходимых для построения 3D-сцены.

Интерфейс прикладного программирования WebGL API сравнительно низкоуровневый [3]. И в частности, камера всегда расположена в начале координат [0, 0, 0] и видит сцену по вектору [0, 0, -1]. Если необходимо увидеть сцену из любой другой точки, в некотором заданном направлении, то программисту необходимо пересчитать координаты всей сцены (подвинуть и повернуть сцену), чтобы желаемая точка наблюдения оказалась перед координатами [0, 0, 0]::[0, 0, -1]. Задача решается просто. На начальном этапе отрисовки сцены необходимо инициировать "матрицу сцены" не единичной, а "обратной матрицей камеры". Которая заполняется значениями, в порядке обратных движений [4], [5].

Задание на полёт может быть произвольным, поэтому положение камеры, которое позволит увидеть качество работы автопилота (отклонения от трека) необходимо вычислять. Неплохой вариант размещения камеры – позади КА на некотором удалении (с программируемой дистанцией). Для вычисления положения и поворота камеры используется следующий алгоритм. В окрестности текущего положения КА вычисляются координаты двух точек принадлежащие треку полётного задания (кривой Безье). Имея отрезок в пространстве, программа вычисляет коллинеарный вектор единичной длины, выходящий из начала координат и кватернион кратчайшего поворота к нему от вектора начального положения камеры [0, 0, 0]::[0, 0, -1]. Таким образом три параметра определяют положение камеры в сцене: текущее положение КА на треке, кватернион поворота до касательной к треку, дистанция между камерой и КА.

Инструкции к сохранению веб-страницы на локальном диске и к использованию интегрированной среды разработки браузера, [F12], (с целью изучения и отладки кода описанной программы), имеются в документе доступном по первой гиперссылке.

[КА: Собственное вращение] [КА: Контур скорости] [КА: Контур ориентации]
[КА: Отладка СОиС] [КА: Трек полёта] [КА: Полёт с СОиС]

Литература

  1. WebGLFundamentals.org: WebGL 3D Geometry – Lathe // URL: https://webglfundamentals.org/webgl/lessons/webgl-3d-geometry-lathe.html (дата обращения: 23.08.2017).
  2. Brandon Jones. glMatrix – Javascript Matrix and Vector library for High Performance WebGL apps // URL: http://glmatrix.net (дата обращения: 23.08.2017).
  3. WebGLFundamentals.org: WebGL – Растеризация или 3D-библиотека // URL: https://webglfundamentals.org/webgl/lessons/ru/webgl-2d-vs-3d-library.html (дата обращения: 23.08.2017).
  4. WebGLFundamentals.org: WebGL – Камеры // URL: https://webglfundamentals.org/webgl/lessons/ru/webgl-3d-camera.html (дата обращения: 23.08.2017).
  5. Sergey. Перевод уроков "WebGL lessons: Урок 10 – Загрузка мира и основы камеры" // DevBurn.ru. URL: http://devburn.ru/webgl-урок-10-загрузка-мира-и-основы-камеры/ (дата обращения: 23.08.2017).

2017.08.23